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