none
Sacar un grupo de registros para una consulta UNION RRS feed

  • Pregunta

  • Hola Chicos,

    Esta pregunta es una mezcla entre SQL y .NET

    Hago un Procedimiento que me devuelve los siguientes valores

    CComo podeis ver es un procedimiento que hace un bucle y lee varias veces y, por tanto, no lo saca en un solo registro ¿Problema? Pues que cuándo leo eso con una función en mi código de .net sólamente devuelve el primer registro porque interpreta como un solo registro de lectura el primero y, por tanto, me gustaría que fuera solo un registro de lectura para poder ttener acceso  a todos los registros. Se me ha ocurrido hacer todo este juego a través del código, pero es llamar muchas veces a una consulta y eso es no-productivo ¿Podéis ayudarme por favor?

    Gracias

    martes, 10 de marzo de 2020 11:31

Respuestas

  • Si estas leyendo desde la parte cliente con un SqlDataReader, el truco es llamar al metodo .NextResult() del datareader para ir saltando al siguiente conjunto de registros devuelto por el procedimiento. Cuando ya no haya más resultados, NextResult devuelve false.

    Otra alternativa es hacer el cambio en el lado SQL. Podrías hacer que el bucle inserte los registros en una tabla temporal, y luego devolver un Select sobre esa tabla, con lo que te llegaría todo junto en una sola Select al lado cliente. O podrías cambiar el procedimiento almacenado por una función de tipo tabla multi-sentencia, que daría igualmente un solo conjunto de resultados desde el punto de vista del cliente.

    • Marcado como respuesta Jesús Prieto martes, 10 de marzo de 2020 15:02
    martes, 10 de marzo de 2020 11:52
  • hola

    Inicio comentando que no recomiendo el uso de cursores, deberias poder resolverlo creando un query simple, no se usando el IN y poniendo la lista de valores que quieres filtrar u otra alternativa, pero de ser posible evita usar cursores

    Ahora bien, si tienes varios resultados el SqlDataReader te permite obtenerlos

    Recuperación de datos mediante DataReader

    analiza el titulo "Recuperar varios conjuntos de resultados mediante NextResult"

    con eso podras acceder a los diferentes resultados

    O sino al hacer el Fill() con el SqlDataAdapter en un DataSet podrias obtener estos en varios DataTable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Jesús Prieto martes, 10 de marzo de 2020 15:01
    martes, 10 de marzo de 2020 12:30

Todas las respuestas

  • Si estas leyendo desde la parte cliente con un SqlDataReader, el truco es llamar al metodo .NextResult() del datareader para ir saltando al siguiente conjunto de registros devuelto por el procedimiento. Cuando ya no haya más resultados, NextResult devuelve false.

    Otra alternativa es hacer el cambio en el lado SQL. Podrías hacer que el bucle inserte los registros en una tabla temporal, y luego devolver un Select sobre esa tabla, con lo que te llegaría todo junto en una sola Select al lado cliente. O podrías cambiar el procedimiento almacenado por una función de tipo tabla multi-sentencia, que daría igualmente un solo conjunto de resultados desde el punto de vista del cliente.

    • Marcado como respuesta Jesús Prieto martes, 10 de marzo de 2020 15:02
    martes, 10 de marzo de 2020 11:52
  • hola

    Inicio comentando que no recomiendo el uso de cursores, deberias poder resolverlo creando un query simple, no se usando el IN y poniendo la lista de valores que quieres filtrar u otra alternativa, pero de ser posible evita usar cursores

    Ahora bien, si tienes varios resultados el SqlDataReader te permite obtenerlos

    Recuperación de datos mediante DataReader

    analiza el titulo "Recuperar varios conjuntos de resultados mediante NextResult"

    con eso podras acceder a los diferentes resultados

    O sino al hacer el Fill() con el SqlDataAdapter en un DataSet podrias obtener estos en varios DataTable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Jesús Prieto martes, 10 de marzo de 2020 15:01
    martes, 10 de marzo de 2020 12:30
  • Esta opción "O sino al hacer el Fill() con el SqlDataAdapter en un DataSet podrias obtener estos en varios DataTable" es la que me interesa, porque hago la llamada al procedimiento del siguiente modo

    ublic Function obtenerListadoProductosSubProductosSucursalEmpresa(idSucursalEmpresa As Integer, texto As String, hachSucursalEmpresa As String,
                                                               act As Boolean, eli As Boolean) As DataTable
            Dim Cmd As New SqlCommand()
            Dim Cn As New SqlConnection
            Dim cFnc As New funciones
            Cn = New SqlConnection(ConfigurationManager.ConnectionStrings("cytsd").ConnectionString)

            Dim Procedimiento As String
            Procedimiento = "OBTENER_LISTADO_PRODUCTOS_SUBPRODUCTOS_SUCURSAL_EMPRESA"

            Dim Da As SqlDataAdapter = New SqlDataAdapter(Cmd)
            Dim Dt As New DataTable

            Try
                Cn.Open()
                With Cmd
                    .Connection = Cn
                    .CommandText = Procedimiento
                    .CommandType = CommandType.StoredProcedure

                    .Parameters.AddWithValue("@i_idSucursalEmpresa", idSucursalEmpresa)
                    .Parameters.Add("@i_texto", SqlDbType.VarChar, 500).Value = texto
                    .Parameters.Add("@i_hach", SqlDbType.VarChar, 37).Value = cFnc.TratarCadenaHashLectura(hachSucursalEmpresa)
                    .Parameters.AddWithValue("@i_act", act)
                    .Parameters.AddWithValue("@i_eli", eli)

                    Da.Fill(Dt)
                    Return Dt
                End With
            Finally
                Dt = Nothing
                Da = Nothing
                Cn = Nothing
                Cmd = Nothing
                cFnc = Nothing
            End Try
        End Function

    Hago el llenado del datatable, pero sólo me guarda los registros de 1 en 1 y eso, me da el problema

    Gracias

    martes, 10 de marzo de 2020 14:37