Quería ir construyendo las condiciones del WHERE de la consulta SELECT que lleva uno de mis procedimientos, según los valores que llegasen.
Y según ví en lo que encontré en la Web y en este foro, esto se hace con el llamado SQL dinámico.
Según lo visto llegué a hacerlo de dos maneras, las dos probadas a través del SQL Server, como cualquier otra consulta de prueba. Y funcionaban bien.
Pero luego, después de armar el Procedimiento y ejecutar la búsqueda según los parámetros elegidos, a través de la página web, sólo una de las formas funcionaba.
De manera extraña, ahora he vuelto a probar y funcionan las dos: la que está usando el 'sp_executesql' y la que no lo lleva (que es la que de primeras no funcionaba).
Mi pregunta iba a ser por qué no lo hacía la que no funcionaba pero ahora aprovecharé el tema lanzado para preguntar sobre eso de la seguridad en este tipo de consultas, sobre eso de la inyección de código malicioso.
¿Sería mejor usar la que no lleva el 'sp_executesql'? Sino, ¿una y otra son igual de efectivas ó una de ellas tiene mejor resultado?, bueno no sé es la primera vez que hago esto en ASP.NET...
Bueno, estas son las dos formas como me queda el procedimiento:
* con el 'sp_executesql' *
Código:
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[spSelec_AvisoCallCtr] @avis_fecha_ini DATETIME, @avis_fecha_fin DATETIME, @avis_empl INT, @avis_estccrep TINYINT, @avis_filtro NVARCHAR(250) AS SELECT @avis_empl = ISNULL(@avis_empl, 0) SELECT @avis_estccrep = ISNULL(@avis_estccrep, 0) -- SIEMPRE VIENE UNA FECHA DE INICIO Y OTRA DE FIN -- EL PARÁMETRO @avis_empl SERÁ: -- * 0, PARA TODOS U OTRO NÚMERO PARA UNO DETERMINADO -- EL PARÁMETRO @avis_estccrep SERÁ: -- * 0, PARA CUALQUIERA U OTRO NÚMERO PARA UNO DETERMINADO -- EL PARÁMETRO @avis_filtro SERÁ: -- * esnulo, SI NO SE INDICA NADA Ó EL TÉRMINO A CONSIDERAR DECLARE @WHERE NVARCHAR(1000) DECLARE @SQL_LARGO NVARCHAR(2000) SET @WHERE = ' WHERE avis_fecha BETWEEN @avis_fecha_ini AND @avis_fecha_fin' IF @avis_empl <> 0 SET @WHERE = @WHERE + ' AND avis_empl = @avis_empl' IF @avis_estccrep <> 0 SET @WHERE = @WHERE + ' AND avis_estccrep = @avis_estccrep' IF @avis_filtro <> 'esnulo' SET @WHERE = @WHERE + ' AND (avis_asunto LIKE + ''%' + @avis_filtro + '%''' + ' OR avis_descrip LIKE + ''%' + @avis_filtro + '%''' + ' OR avis_clienom LIKE + ''%' + @avis_filtro + '%''' + ' OR avis_contactoclie LIKE + ''%' + @avis_filtro + '%'')' SET @SQL_LARGO = 'SELECT avis_id, avis_fecha, ISNULL(CONVERT(NVARCHAR,avis_clieid),''0'') AS avis_clieid, avis_clienom, avis_asunto, estccrep_nom, nombre AS empl_nom_completo FROM EMPLEADOS INNER JOIN ( AVISOS INNER JOIN ESTADOS_CCREP ON AVISOS.avis_estccrep = ESTADOS_CCREP.estccrep_id) ON EMPLEADOS.codigo = AVISOS.avis_empl' + @WHERE + ' ORDER BY avis_fecha DESC, avis_clienom, estccrep_nom, empl_nom_completo' exec sp_executesql @SQL_LARGO, N'@avis_fecha_ini DATETIME, @avis_fecha_fin DATETIME, @avis_empl INT, @avis_estccrep TINYINT, @avis_filtro NVARCHAR(250)', @avis_fecha_ini, @avis_fecha_fin, @avis_empl, @avis_estccrep, @avis_filtro
* sin el 'sp_executesql' *
Código:
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[spSelec_AvisoCallCtr] @avis_fecha_ini DATETIME, @avis_fecha_fin DATETIME, @avis_empl INT, @avis_estccrep TINYINT, @avis_filtro NVARCHAR(250) AS SELECT @avis_empl = ISNULL(@avis_empl, 0) SELECT @avis_estccrep = ISNULL(@avis_estccrep, 0) -- SIEMPRE VIENE UNA FECHA DE INICIO Y OTRA DE FIN -- EL PARÁMETRO @avis_empl SERÁ: -- * 0, PARA TODOS U OTRO NÚMERO PARA UNO DETERMINADO -- EL PARÁMETRO @avis_estccrep SERÁ: -- * 0, PARA CUALQUIERA U OTRO NÚMERO PARA UNO DETERMINADO -- EL PARÁMETRO @avis_filtro SERÁ: -- * esnulo, SI NO SE INDICA NADA Ó EL TÉRMINO A CONSIDERAR SELECT avis_id, avis_fecha, ISNULL(CONVERT(NVARCHAR,avis_clieid),'0') AS avis_clieid, avis_clienom, avis_asunto, estccrep_nom, nombre AS empl_nom_completo FROM EMPLEADOS INNER JOIN ( AVISOS INNER JOIN ESTADOS_CCREP ON AVISOS.avis_estccrep = ESTADOS_CCREP.estccrep_id) ON EMPLEADOS.codigo = AVISOS.avis_empl WHERE avis_fecha BETWEEN @avis_fecha_ini AND @avis_fecha_fin AND ( @avis_empl = 0 Or avis_empl = @avis_empl ) AND ( @avis_estccrep = 0 Or avis_estccrep = @avis_estccrep ) AND ( @avis_filtro = 'esnulo' Or (avis_asunto LIKE '%' + @avis_filtro + '%' OR avis_descrip LIKE '%' + @avis_filtro + '%' OR avis_clienom LIKE '%' + @avis_filtro + '%' OR avis_contactoclie LIKE '%' + @avis_filtro + '%')) ORDER BY avis_fecha DESC, avis_clienom, estccrep_nom, empl_nom_completo