Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wstaw do tabeli tymczasowej z procedury składowanej, która zwraca wiele zestawów wyników

Stary post, ale napotkałem ten sam problem i chociaż powyższe odpowiedzi są nieco powiązane, pytanie OP dotyczy SP, które zwraca wiele zestawów. Jedynym rozwiązaniem, jakie udało mi się znaleźć, oprócz przepisania SP w celu podzielenia go na mniejsze SP, było napisanie SQL CLR procedura, która wykonuje SP i zwraca tylko wymagany zestaw wyników. Procedura pobiera indeks wymaganego zestawu wyników, wykonuje SqlCommand do uruchomienia początkowego T-SQL SP, a następnie przechodzi przez SqlDataReader wyniki, aż znajdzie żądany zestaw wyników i zwróci odpowiednie rekordy. Poniższy kod jest częścią SQL CLR procedura:

SqlDataReader rdr = command.ExecuteReader();
int index = 0;
bool bContinue = true;
while (index < resultSetIndex.Value)
{
    if (!rdr.NextResult())
    {
        bContinue = false;
        break;
    }
    index++;
}
if (!bContinue)
    throw new Exception("Unable to read result sets.");

......

List<SqlMetaData> metadataList = new List<SqlMetaData>();
for (int i = 0; i < rdr.FieldCount; i++)
{
    string dbTypeName = rdr.GetDataTypeName(i);
    SqlMetaData metadata;
    if (dbTypeName.ToLower().Contains("char"))
        metadata = new SqlMetaData(rdr.GetName(i), (SqlDbType)Enum.Parse(typeof(SqlDbType), dbTypeName, true), 50);
    else
        metadata = new SqlMetaData(rdr.GetName(i), (SqlDbType)Enum.Parse(typeof(SqlDbType), dbTypeName, true));
    metadataList.Add(metadata);
}
SqlDataRecord record = new SqlDataRecord(metadataList.ToArray());
object[] values = new object[rdr.FieldCount];
if (rdr.HasRows)
{
    SqlContext.Pipe.SendResultsStart(record);
    while (rdr.Read())
    {
        rdr.GetValues(values);
        record.SetValues(values);
        SqlContext.Pipe.SendResultsRow(record);
    }
    SqlContext.Pipe.SendResultsEnd();
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Łączenie ciągów t-sql

  2. Zaktualizuj i dołącz, chyba że jest pusty

  3. Sterownik sqlsrv 4.0 nie działa w phpinfo()

  4. Jak usunąć puste wiersze z wyniku zapytania sql?

  5. Obsługa nieistniejących wartości w wyrażeniu zapytania sql dla wykresu ssrs