Posting lama, tetapi saya menghadapi masalah yang sama dan meskipun jawaban yang disebutkan di atas sedikit terkait, pertanyaan OP adalah tentang SP yang mengembalikan beberapa set. Satu-satunya solusi yang dapat saya temukan, selain menulis ulang SP untuk membaginya menjadi SP yang lebih kecil, adalah dengan menulis SQL CLR
prosedur yang mengeksekusi SP dan hanya mengembalikan set hasil yang diperlukan. Prosedur mendapatkan indeks dari kumpulan hasil yang diperlukan, menjalankan SqlCommand
untuk menjalankan T-SQL
. awal SP, lalu mengulang melalui SqlDataReader
hasil sampai menemukan set hasil yang diinginkan dan mengembalikan catatan yang sesuai. Kode berikut adalah bagian dari SQL CLR
prosedur:
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();
}