SQL Dinamico

24/04/2006 - 03:25 por Jano | Informe spam
Compañeros

En mi aplicacion los reportes pueden ser modificados en cuanto a la cantidad
de columnas que presenta, el filtro (where) y el orden (order by).
Investigando en la red, encontre que con SQL Dinamico puedo solucionar el
tema, pero por otro lado en muchos de los links que investigue, hablaban de
la inyeccion de codigo sql ( lo cual fue una novedad para mi por ser novato
en SQL Server) y me ha dejado preocupado este problema.

Sobre el particular quisiera pedirles sus opiniones con respecto al tema,
entiendo tambien que mucho de las soluciones se basan en las buenas
practicas de desarrollo con SQL Server. Como poder evitar la inyeccion de
codigo SQL es la principal interrogante, como y cuando usar SQL Dinamico,
que ese SQL Dinamico sea de optima ejecucion y otras cuestiones que
seguramente, colegas con mayor experiencia que yo, habran encontrando en su
experiencia personal.

Saludos

Jano

Preguntas similare

Leer las respuestas

#1 Maxi [MVP]
24/04/2006 - 03:34 | Informe spam
http://www.sommarskog.se/dyn-search.html

Para leer


Salu2
-
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org

MSN:

"Jano" escribió en el mensaje
news:
Mostrar la cita
#2 GenioMaestro
24/04/2006 - 09:10 | Informe spam
Interesante, pero no lo recomiendo.

El SQL Dinamico es muy interesante porque te permite realizar la consulta
como quieras en cada momento, pero sp_executesql es muy lento en comparación
con un procedimiento almacenado con parámetros.

Yo aconsejo trabajar un poco más y hacer algo como esto:

ALTER PROCEDURE [dbo].[VISOR_NOTAS](@F1 DATETIME, @MER_MIN AS INT, @MER_MAX
AS INT, @ORDEN AS INT)
AS
SELECT TOP (1000) MERCADOS.Mercado, VALORES.Valor, VALORES.Descripcion,
COTIZACIONES.Cierre, CALCULOS.Fecha_Cal, CALCULOS.Momento140,
CALCULOS.Mom_Pen140, CALCULOS.Soporte, CALCULOS.Dif_Soporte,
CALCULOS.Resistencia, CALCULOS.Dif_Resistencia,
CALCULOS.Fecha_Resistencia, CALCULOS.Cap_Ponderada,
CALCULOS.Rango_Ponderado, CALCULOS.Etapa, CALCULOS.Calidad,
CALCULOS.Estado_Etapa, CALCULOS.Estado_Mv140, CALCULOS.Estado_Pen140,
CALCULOS.Nota_Rango, CALCULOS.Nota_Etapa,
CALCULOS.Nota_Estado, CALCULOS.Nota_Resistencia,
CALCULOS.Nota_Capitalizacion, CALCULOS.Nota_Precio, CALCULOS.NOTA_FINAL
FROM MERCADOS INNER JOIN
VALORES ON MERCADOS.Codigo = VALORES.Cod_Mercado INNER JOIN
COTIZACIONES ON VALORES.Auto_Cod_Valor = COTIZACIONES.Cod_Valor INNER
JOIN
CALCULOS ON COTIZACIONES.Cod_Valor = CALCULOS.Cod_Valor AND FECHA =
FECHA_CAL
WHERE
CALCULOS.Fecha_Cal = @F1 and
cod_mercado >= @MER_MIN and cod_mercado <= @MER_MAX
ORDER BY
CASE
WHEN @ORDEN = 1 then cast(Estado_Mv140 as char(10))
WHEN @ORDEN = 2 then calidad
WHEN @ORDEN = 3 then cast(Nota_Rango as char(10))
WHEN @ORDEN = 4 then cast(Nota_final as char(10))
END
DESC

La select es siempre la misma, siempre obtengo los mismos campos desde las
mismas tablas, pero tengo WHERE dinámico por parámetros y orden dinámico
también por parámetros.

Es muy rápido, prácticamente instantáneo. Mira a ver si te vale.

Un saludo.



"Maxi [MVP]" escribió en el mensaje
news:eRKz%
Mostrar la cita
#3 Maxi
24/04/2006 - 14:03 | Informe spam
Hola, eso no es siempre posible :( hoy con sql2005 y el execute as mejora
bastante el uso de SQL-Dinamico y la seguridad


Salu2
Maxi [MVP SQL SERVER]
www.sqlgurus.org


"GenioMaestro" escribió en el mensaje
news:OJV%
Mostrar la cita
#4 Alejandro Mesa
24/04/2006 - 14:20 | Informe spam
GenioMaestro,

Mostrar la cita
El filtro que usas no se considera dinamico en cuanto al numero de columnas
que usa. Jano se refiere a que las columnas usadas en la clausula "where" y/o
"order by" puede variar, y los parametros pueden venir con valores o con
valor "null".


AMB


"GenioMaestro" wrote:

Mostrar la cita
#5 Alejandro Mesa
24/04/2006 - 14:22 | Informe spam
Jano,

Te recomiendo que leas este articulo, y si aun tienes dudas no vaciles en
postear tus preguntas.

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB


"Jano" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida