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