Bài cũ, nhưng tôi gặp phải vấn đề tương tự và mặc dù các câu trả lời được đề cập ở trên có một chút liên quan, câu hỏi của OP là về SP trả về nhiều bộ. Giải pháp duy nhất tôi có thể tìm thấy, ngoài việc viết lại SP để chia nó thành các SP nhỏ hơn, là viết một SQL CLR
thủ tục thực thi SP và chỉ trả về tập kết quả được yêu cầu. Thủ tục nhận chỉ mục của tập kết quả được yêu cầu, thực thi SqlCommand
để chạy T-SQL
intial SP, sau đó lặp qua SqlDataReader
kết quả cho đến khi nó tìm thấy tập kết quả mong muốn và trả về các bản ghi tương ứng. Đoạn mã sau là một phần của SQL CLR
thủ tục:
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();
}