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