Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/09/2007, 02:08
Avatar de zacktagnan
zacktagnan
 
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 1 mes
Puntos: 3
Procedimiento con SQL dinámico

Hola a tod@s:

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
__________________
Saludos,

zacktagnan.
=================================================

Última edición por zacktagnan; 14/09/2007 a las 08:50