Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

In temporäre Tabelle aus einer gespeicherten Prozedur einfügen, die mehrere Resultsets zurückgibt

Alter Beitrag, aber ich hatte das gleiche Problem und obwohl die oben genannten Antworten ein wenig verwandt sind, bezieht sich die Frage des OP auf SP, das mehrere Sätze zurückgibt. Die einzige Lösung, die ich finden konnte, abgesehen vom Umschreiben des SP, um es in kleinere SPs aufzuteilen, bestand darin, eine SQL CLR zu schreiben Prozedur, die den SP ausführt und nur die erforderliche Ergebnismenge zurückgibt. Die Prozedur erhält den Index der erforderlichen Ergebnismenge und führt einen SqlCommand aus um das anfängliche T-SQL auszuführen SP durchläuft dann einen SqlDataReader Ergebnisse, bis es die gewünschte Ergebnismenge findet und die entsprechenden Datensätze zurückgibt. Der folgende Code ist Teil der SQL CLR Verfahren:

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();
}