Gammelt indlæg, men jeg stod over for det samme problem, og selvom svarene nævnt ovenfor er lidt relaterede, handler OP's spørgsmål om SP, der returnerer flere sæt. Den eneste løsning, jeg kunne finde, udover at omskrive SP'en for at opdele den i mindre SP'er, var at skrive en SQL CLR
procedure, der udfører SP og kun returnerer det påkrævede resultatsæt. Proceduren henter indekset for det påkrævede resultatsæt, udfører en SqlCommand
for at køre den oprindelige T-SQL
SP, går derefter gennem en SqlDataReader
resultater, indtil den finder det ønskede resultatsæt og returnerer de tilsvarende poster. Følgende kode er en del af SQL CLR
procedure:
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();
}