sql >> Databasteknik >  >> RDS >> Sqlserver

Infoga i temporär tabell från en lagrad procedur som returnerar flera resultatuppsättningar

Gammalt inlägg, men jag stod inför samma problem och även om svaren som nämns ovan är lite relaterade, handlar OP:s fråga om SP som returnerar flera set. Den enda lösningen jag kunde hitta, förutom att skriva om SP:n för att dela upp den i mindre SP:er, var att skriva en SQL CLR procedur som exekverar SP och returnerar endast den önskade resultatuppsättningen. Proceduren hämtar indexet för den önskade resultatuppsättningen, exekverar ett SqlCommand för att köra den ursprungliga T-SQL SP, går sedan genom en SqlDataReader resultat tills den hittar den önskade resultatuppsättningen och returnerar motsvarande poster. Följande kod är en del av SQL CLR procedur:

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. MYSQL:Procedur med if-sats

  2. Vad är det snabbaste sättet att dumpa och ladda en MySQL InnoDB-databas med mysqldump?

  3. Hibernate:constraintName är null i MySQL

  4. Partitionsfunktion COUNT() OVER möjlig med DISTINCT