sql >> Base de Datos >  >> RDS >> Sqlserver

Insertar en la tabla temporal desde un procedimiento almacenado que devuelve múltiples conjuntos de resultados

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();
}