Publicación anterior, pero enfrenté el mismo problema y, aunque las respuestas mencionadas anteriormente están un poco relacionadas, la pregunta del OP es sobre SP que devuelve varios conjuntos. La única solución que pude encontrar, además de reescribir el SP para dividirlo en SP más pequeños, fue escribir un SQL CLR
procedimiento que ejecuta el SP y devuelve solo el conjunto de resultados requerido. El procedimiento obtiene el índice del conjunto de resultados requerido, ejecuta un SqlCommand
para ejecutar el T-SQL
inicial SP, luego recorre un SqlDataReader
resultados hasta que encuentre el conjunto de resultados deseado y devuelva los registros correspondientes. El siguiente código es parte de SQL CLR
procedimiento:
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();
}