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:
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

Respuesta Responder a este mensaje
#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%
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:
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





Respuesta Responder a este mensaje
#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%
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%
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:
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









Respuesta Responder a este mensaje
#4 Alejandro Mesa
24/04/2006 - 14:20 | Informe spam
GenioMaestro,

mismas tablas, pero tengo WHERE dinámico por parámetros y orden dinámico
también por parámetros.



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:

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%
> 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:
>> 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
>>
>
>



Respuesta Responder a este mensaje
#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:

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



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida