jueves, 10 de diciembre de 2015

Stored Procedure con parámetro tabla

Me vi en la necesidad de enviar  un parámetro  tipo tabla que contendría una lista de ID´ seleccionador por el  usuario desde la interfaz, y  para eso a programar desde  C# enviando la tabla. Encontré muchos tutoriales pero no me quedaba claro.

De esta  página obtuve el conocimiento principal.

En primer lugar  crear  'El tipo tabla'
Yo lo veo algo  así como plantillas que podremos usar muy precisamente acorde a sus 
tipos de columnas. Y como lo que quiero  es enviar una lista con los IDs seleccionados
Mi tipo de tabla solo contiene una columna int
CREATE TYPE IDS_TableType AS TABLE 
( ID INT );

Después crear el procedimiento  almacenado utilizando el tipo de tabla
recién declarado  'IDS_TableType'.

CREATE PROCEDURE SP_ReporteAgrupadoMedicos
    @TablaInterfaz IDS_TableType READONLY,
    @FechaInicio char(10),
    @FechaFin  char(10)
    AS 
    BEGIN
    SELECT  RTRIM(paciente.Nombre) + ' ' + RTRIM(paciente.Ap_Paterno) + ' ' + RTRIM(paciente.Ap_Materno) AS Paciente,
   CAST((DATEDIFF(DAY,paciente.Fecha_Nacimiento,GETDATE())/365) as CHAR(3))+' años' as Edad, 
   Procedencia=(
   case 
   when i.TipoIngreso=0 then tipoIngreso.Item
   when i.TipoIngreso=1 then 'Empresa en  convenio '+convenio.Empresa
   when i.TipoIngreso=2 then tipoIngreso.Item
   when i.TipoIngreso=3 then tipoIngreso.Item
   when i.TipoIngreso=4 then tipoIngreso.Item
   when i.TipoIngreso=5 then tipoIngreso.Item
   END), 
   dbo.FN_DiagnosticosCie10(i.idPaciente,i.idIngreso) Diagnostico,
   i.Doctor idDoctor,RTRIM(usuario.Nombre)+SPACE(1)+RTRIM(usuario.Ap_Paterno)+SPACE(1)+ RTRIM(usuario.Ap_Materno) Medico
   FROM  dbo.AdmIngresosPacientes AS i 
      LEFT JOIN dbo.ExpPacientes AS paciente ON i.idPaciente = paciente.idPaciente 
      LEFT JOIN AdmListasDesplegables tipoIngreso on tipoIngreso.id=i.TipoIngreso AND tipoIngreso.NombreLista='TipoIngreso'
      LEFT JOIN ExpEmpresasConvenios  convenio on convenio.id=i.EmpresaConvenio
      LEFT JOIN ExpUsuarios as usuario on usuario.idUsuario=i.Doctor
   where   i.FechaIngreso between +@FechaInicio+' 00:00:00' AND @FechaFin+' 23:59:59' 
   AND  Doctor IN (select id from @TablaInterfaz);
     END

Lo que ven es la cláusula  IN  mas info  Aquí
Hasta aquí el procedimiento  creado
-------------------------------------
Ahora para acceder a el  desde SQL Server, creamo una  variable tabla del tipo IDS_TableType 
que hicimos en el primer paso. Le cargamos datos con Insert  y por último 
mando llamar mi procedimiento almacenado enviando la tabla @LocationTVP 
DECLARE @LocationTVP 
AS IDS_TableType;
INSERT INTO @LocationTVP (ID)
    values 
    (1),(4),(58),(175),(176);    

EXEC SP_ReporteAgrupadoMedicos @LocationTVP,'10-12-2015','10-12-2015';
---------------------------------------------------------------
Y el  código para hacer lo mismo  desde C#. Yo estoy obteniendo de
una lista de CheckBoxes los elementos seleccionador y creando la tabla
addedCategories . Lo otro ya lo conocen y el DataTable dt  es
el  resultado que pueden usar para llenar GridViews.
 DataTable Procedimiento()
        {
            DataTable addedCategories = new DataTable();
            addedCategories.Columns.Add("Id");
            DataRow row;

                foreach (ListItem item in chkListaMedicos.Items)
                {
                    if (item.Selected)
                    {
                        row = addedCategories.NewRow();
                        row[0] = item.Value;
                        addedCategories.Rows.Add(row);
                    }
                }

            
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter("SP_ReporteAgrupadoMedicos",con.CON);
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            da.SelectCommand.Parameters.Add("@TablaInterfaz", SqlDbType.Structured).Value=addedCategories;
            da.SelectCommand.Parameters.Add("@FechaInicio", SqlDbType.Char).Value = txtFechaInicio.Text;
            da.SelectCommand.Parameters.Add("@FechaFin", SqlDbType.Char).Value = txtFechaFin.Text;
            da.Fill(dt);
            return dt;
        }















No hay comentarios.:

Publicar un comentario