2010-11-12 22 views
28

acabo hizo una pregunta relacionada con SQL, y la primera respuesta fue: "Esta es una situación en la que SQL dinámico es el camino a seguir."¿Qué es SQL dinámico?

ya que nunca había oído hablar de SQL dinámico antes, Inmediatamente busqué este sitio y la web por lo que era. Wikipedia no tiene ningún artículo con este título. Los primeros resultados de Google apuntan a foros de usuarios donde las personas hacen preguntas más o menos relacionadas.

Sin embargo, no encontré una definición clara de lo que es un "SQL dinámico". ¿Es algo específico del vendedor? Trabajo con MySQL y no encontré una referencia en el manual de MySQL (solo preguntas, la mayoría sin respuesta, en los foros de usuarios de MySQL). Por otra parte, encontré muchas referencias a procedimientos almacenados. Tengo una idea un poco mejor de lo que son los procedimientos almacenados, aunque nunca he usado ninguno. ¿Cómo se relacionan los dos conceptos? ¿Son lo mismo o uno usa el otro?

Básicamente, lo que se necesita es una introducción simple a SQL dinámico para alguien que es nuevo en el concepto.

PD: Si te apetece, puede tener un ir en responder a mi pregunta anterior que llevó a éste: SQL: How can we make a table1 JOIN table2 ON a table given in a field in table1?

+0

Hubiera sido bueno publicar el enlace a la pregunta a la que se refiere: http://stackoverflow.com/q/4164808/288773 – oezi

+0

Duplicado: * [¿Qué es una consulta SQL dinámica, y cuándo podría querer? para usar uno?] (http://stackoverflow.com/questions/2190016) *. –

+0

Posible duplicado de [¿Qué es una consulta SQL dinámica, y cuándo querría usar una?] (Http://stackoverflow.com/questions/2190016/what-is-a-dynamic-sql-query-and-when -would-you-want-to-use-one) –

Respuesta

19

SQL dinámico no es más que la consulta se ha construido sobre la marcha - con un poco de proveedores, puede crear el texto de la consulta dinámica dentro de un procedimiento almacenado y luego ejecutar el SQL generado. En otros casos, el término simplemente se refiere a una decisión tomada por código en el cliente (al menos es neutral del proveedor)

+1

Cada vez que leo acerca de SQL Injection, las personas usan Dynamic SQL como puramente la construcción de la consulta utilizando concatenación de cadenas y variables en tiempo de ejecución. La razón es que lo contrastan con consultas parametrizadas y procedimientos almacenados. –

14

SQL dinámico es simplemente una declaración SQL que se compila sobre la marcha antes de ejecutarse. Por ejemplo, el siguiente C# (utilizando una consulta parametrizada):

var command = new SqlCommand("select * from myTable where id = @someId"); 
command.Parameters.Add(new SqlParameter("@someId", idValue)); 

puede ser re-escrito el uso de SQL dinámico como:

var command = new SqlCommand("select * from myTable where id = " + idValue); 

Tenga en cuenta, sin embargo, que SQL dinámico es peligroso, ya que fácilmente permite ataques de inyección SQL.

+1

+1 Por mencionar ataques de inyección SQL – pramodc84

+1

Esto tenía más sentido para mí como alguien que tampoco sabía de qué se trataba. –

+0

Esta respuesta dio el mejor ejemplo; fácil nota dominante con muchas otras palabras. ¡Gracias! –

1

Rowland es correcto, y como anexo, a menos que esté utilizando correctamente los parámetros (en lugar de solo concatenar valores de parámetros en línea desde el texto proporcionado, etc.) también puede ser un riesgo de seguridad. También es difícil de depurar, etc.

Por último, cada vez que utiliza SQL dinámico de forma imprudente, se desatan cosas y se comen niños.

0

Creo que lo que quiere decir es que debe compilar la consulta dinámicamente antes de ejecutarla. Para sus otras preguntas, esto significa que primero debe seleccionar el nombre de la tabla que necesita y usar su lenguaje de programación para crear una segunda consulta para hacer lo que desea (lo que desea hacer en la otra pregunta no es posible directamente como lo desea)

10

SQL dinámico es un SQL creado a partir de cadenas en tiempo de ejecución. Es útil para establecer dinámicamente filtros u otras cosas.

Un ejemplo:

declare @sql_clause varchar(1000) 
declare @sql varchar(5000) 


set @sql_clause = ' and '  
set @sql = ' insert into #tmp 
select 
    * 
from Table 
where propA = 1 '  

if @param1 <> ''  
begin  
    set @sql = @sql + @sql_clause + ' prop1 in (' + @param1 + ')'  
end  
if @param2 <> ''  
begin  
    set @sql = @sql + @sql_clause + ' prop2 in (' + @param2 + ')'  
end 

exec(@sql) 
+0

Parece que esta consulta produciría SQL no válido, "where y propX in ..." – cairnz

+1

My bad :). Bueno, es solo para ayudar a explicar. Fijo. – Pedro

3

Es exactamente lo mencionó Rowland. Para más detalles sobre esto un poco, tomar el siguiente SQL:

Select * from table1 where id = 1 

No estoy seguro de que el lenguaje que utiliza para conectarse a la base de datos, pero si tuviera que utilizar C#, un ejemplo de una consulta SQL dinámico haría ser algo como esto:

string sqlCmd = "Select * from table1 where id = " + userid; 

se quiere evitar el uso de SQL dinámico, porque se convierte en un poco engorroso para mantener la integridad del código si la consulta sea demasiado grande. Además, muy importante, el SQL dinámico es susceptible a los ataques de inyección SQL.

Una mejor forma de escribir la declaración anterior sería usar parámetros, si está utilizando SQL Server.

0

¿Es algo específico del vendedor?

El estándar SQL-92 tiene un capítulo completo sobre SQL dinámico (capítulo 17) pero solo se aplica a FULL SQL-92 y no conozco ningún proveedor que lo haya implementado.

14

Otras respuestas han definido lo SQL dinámico es, pero yo no vi ninguna otras respuestas que intentaron describir qué que a veces hay que usarla. (Mi experiencia es SQL Server, pero creo que otros productos son generalmente similares a este respecto.)

SQL dinámico es útil cuando reemplaza partes de una consulta que no se pueden reemplazar utilizando otros métodos.

Por ejemplo, cada vez que se llama a una consulta como:

SELECT OrderID, OrderDate, TotalPrice FROM Orders WHERE CustomerID = ?? 

se le pasa en un valor diferente para CustomerID. Este es el caso más simple, y uno que puede ser resuelto mediante una consulta parametrizada, o un procedimiento almacenado que acepta un parámetro, etc.

En términos generales, SQL dinámico se debe evitar en favor de las consultas con parámetros, para un rendimiento y razones de seguridad (Aunque la diferencia de rendimiento probablemente varía bastante entre los proveedores, y quizás incluso entre las versiones del producto, o incluso la configuración del servidor).

Otras búsquedas son posible hacer uso de parámetros, pero podrían ser más simple SQL como dinámica:

SELECT OrderID, OrderDate, TotalPrice FROM Orders 
WHERE CustomerID IN (??,??,??) 

Si siempre tuviste 3 valores, esto es tan fácil como la primera. Pero, ¿y si esta es una lista de longitud variable? Es posible hacer con los parámetros, pero puede ser muy difícil.¿Qué tal:

SELECT OrderID, OrderDate, TotalPrice FROM Orders WHERE CustomerID = ?? 
ORDER BY ?? 

Esto no puede ser sustituido directamente, puede hacerlo con una declaración complicada CASO enorme en el ORDER BY enumerando explícitamente todos los campos posibles, que pueden o no ser prácticos, dependiendo del número de de campos disponibles para ordenar por.

Por último, algunas consultas simplemente NO PUEDEN hacerse con ningún otro método.

Digamos que usted tiene un montón de tablas Pedidos (no diciendo que esto es un gran diseño), pero es posible que se encuentre con la esperanza de que usted puede hacer algo como:

SELECT OrderID, OrderDate, TotalPrice FROM ?? WHERE CustomerID = ?? 

Esto no se puede hacer utilizando cualquier otros metodos. En mi entorno, me encuentro con frecuencia preguntas como:

SELECT (programatically built list of fields) 
FROM table1 INNER JOIN table2 
(Optional INNER JOIN to table3) 
WHERE (condition1) 
AND (long list of other optional WHERE clauses) 

Una vez más, no diciendo que esto es necesariamente gran diseño, pero SQL dinámico es más o menos necesario para este tipo de consultas.

Espero que esto ayude.

Cuestiones relacionadas