Stary post, ale stanąłem w obliczu tego samego problemu i chociaż wspomniane powyżej odpowiedzi są nieco powiązane, pytanie OP dotyczy SP, który zwraca wiele zestawów. Jedynym rozwiązaniem, jakie mogłem znaleźć, oprócz przepisania SP, aby podzielić go na mniejsze SP, było napisanie procedury SQL CLR
, która wykonuje SP i zwraca tylko wymagany zestaw wyników. Procedura uzyskuje indeks wymaganego zestawu wyników, wykonuje SqlCommand
, aby uruchomić początkowe T-SQL
SP, a następnie wykonuje pętle przez wyniki SqlDataReader
, aż znajdzie żądany zestaw wyników i zwróci odpowiednie rekordy. Poniższy kod jest częścią procedury SQL CLR
:
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();
}
http://stackoverflow.com/questions/209383/select-columns-from-result-set-of-stored-procedure – THEn
możliwy duplikat [JAK WYBRAĆ * NA \ [tabela tymczasowa \] FROM \ [Procedura przechowywana \]] (http://stackoverflow.com/questions/653714/how-to-select-into-temp-table-from -stored-procedure) –