Oud bericht, maar ik had hetzelfde probleem en hoewel de hierboven genoemde antwoorden een beetje gerelateerd zijn, gaat de vraag van de OP over SP die meerdere sets retourneert. De enige oplossing die ik kon vinden, afgezien van het herschrijven van de SP om deze op te splitsen in kleinere SP's, was het schrijven van een SQL CLR
procedure die de SP uitvoert en alleen de vereiste resultatenset retourneert. De procedure haalt de index op van de vereiste resultatenset, voert een SqlCommand
uit om de initiële T-SQL
. uit te voeren SP, doorloopt dan een SqlDataReader
resultaten totdat het de gewenste resultaatset vindt en de bijbehorende records retourneert. De volgende code maakt deel uit van de 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();
}