Alter Beitrag, aber ich hatte das gleiche Problem und obwohl die oben genannten Antworten ein wenig verwandt sind, bezieht sich die Frage des OP auf SP, das mehrere Sätze zurückgibt. Die einzige Lösung, die ich finden konnte, abgesehen vom Umschreiben des SP, um es in kleinere SPs aufzuteilen, bestand darin, eine SQL CLR
zu schreiben Prozedur, die den SP ausführt und nur die erforderliche Ergebnismenge zurückgibt. Die Prozedur erhält den Index der erforderlichen Ergebnismenge und führt einen SqlCommand
aus um das anfängliche T-SQL
auszuführen SP durchläuft dann einen SqlDataReader
Ergebnisse, bis es die gewünschte Ergebnismenge findet und die entsprechenden Datensätze zurückgibt. Der folgende Code ist Teil der SQL CLR
Verfahren:
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();
}