una todas seleccionar ocultar menos las excluir excepto dato consulta columnas columna campo mysql sql stored-procedures dynamic-sql

mysql - seleccionar - select todas las columnas sql



¿Qué es SQL dinámico? (9)

¿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.

Acabo de hacer 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 " .

Como nunca antes había oído hablar de SQL dinámico , de inmediato busqué en este sitio y en la web 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 otro lado, 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 al SQL dinámico para alguien que es nuevo en el concepto.

PD: Si te apetece, puedes intentar responder a mi pregunta anterior que provocó esta: SQL: ¿Cómo podemos hacer una tabla1 UNIR tabla2 EN una tabla dada en un campo en la tabla 1?


Creo que lo que se quiere decir es que debes construir 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 )


Es exactamente lo que Rowland mencionó. Para profundizar en eso un poco, tome el siguiente SQL:

Select * from table1 where id = 1

No estoy seguro de qué idioma está utilizando para conectarse a la base de datos, pero si tuviera que usar C #, un ejemplo de una consulta SQL dinámica sería algo como esto:

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

Desea evitar el uso de SQL dinámico, ya que resulta un poco engorroso mantener la integridad del código si la consulta se hace 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á usando SQL Server.


Otras respuestas han definido qué SQL dinámico es, pero no vi ninguna otra respuesta que intentara describir por qué a veces necesitamos usarlo. (Mi experiencia es SQL Server, pero creo que otros productos son generalmente similares a este respecto).

El 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 llamas a una consulta como:

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

pasará un valor diferente para CustomerID. Este es el caso más simple, y uno que puede resolverse usando una consulta parametrizada, o un procedimiento almacenado que acepta un parámetro, etc.

En términos generales , debe evitarse SQL dinámico a favor de consultas parametrizadas, por razones de rendimiento y 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 consultas son posibles de hacer usando parámetros, pero podrían ser más simples como SQL dinámico:

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

Si siempre tuvo 3 valores, esto es tan fácil como el primero. 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 si:

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

Esto no se puede sustituir directamente, puede hacerlo con una gran declaración CASE complicada en el ORDENANDO, enumerando explícitamente todos los campos posibles, que pueden o no ser prácticos, dependiendo de la cantidad de campos disponibles para ordenar.

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

Supongamos que tiene varias tablas de Pedidos (no dice que este es un gran diseño), pero puede esperar que pueda hacer algo como:

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

Esto no se puede hacer usando ningún otro método. En mi entorno, frecuentemente encuentro consultas 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 digo que esto sea necesariamente un gran diseño, pero el SQL dinámico es bastante necesario para este tipo de consultas.

Espero que esto ayude.


Para la mayoría de las bases de datos, cada consulta SQL es "dinámica", lo que significa que es un programa que es interpretado por el optimizador de consultas a la cadena SQL de entrada y posiblemente a los enlaces de los parámetros ("variables de vinculación").

SQL estático

Sin embargo, la mayoría de las veces, esa cadena de SQL no está construida dinámicamente sino estáticamente, ya sea en lenguajes de procedimiento como PL / SQL:

FOR rec IN (SELECT * FROM foo WHERE x = 1) LOOP -- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ "static SQL" .. END LOOP;

O en lenguajes de cliente / host como Java, usando JDBC:

try (ResultSet rs = stmt.executeQuery("SELECT * FROM foo WHERE x = 1")) { // "static SQL" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. }

En ambos casos, la cadena de SQL es "estática" en el idioma que lo incorpora. Técnicamente, seguirá siendo "dinámico" para el motor SQL, que no sabe cómo se construye la cadena SQL, ni que era una cadena SQL estática.

SQL dinámico

A veces, la cadena SQL debe construirse dinámicamente, dados algunos parámetros de entrada. Por ejemplo, la consulta anterior podría no necesitar ningún predicado en algunos casos.

A continuación, puede optar por proceder a construir la cadena de forma dinámica, por ejemplo, en PL / SQL:

DECLARE TYPE foo_c IS REF CURSOR; v_foo_c foo_c; v_foo foo%ROWTYPE; sql VARCHAR2(1000); BEGIN sql := ''SELECT * FROM foo''; IF something THEN sql := sql || '' WHERE x = 1''; -- Beware of syntax errors and SQL injection! END IF; OPEN v_foo_c FOR sql; LOOP FETCH v_foo_c INTO v_foo; EXIT WHEN v_foo_c%NOTFOUND; END LOOP; END;

O en Java / JDBC:

String sql = "SELECT * FROM foo"; if (something) sql += " WHERE x = 1"; // Beware of syntax errors and SQL injection! try (ResultSet rs = stmt.executeQuery(sql)) { .. }

O en Java usando un generador de SQL como jOOQ

// No syntax error / SQL injection risk here Condition condition = something ? FOO.X.eq(1) : DSL.trueCondition(); for (FooRecord foo : DSL.using(configuration) .selectFrom(FOO) .where(condition)) { .. }

Muchos lenguajes tienen librerías de compiladores de consultas como la anterior, que brillan al hacer SQL dinámico.

(Descargo de responsabilidad: trabajo para la compañía detrás de jOOQ)


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

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

Podría reescribirse usando sql dinámico como:

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

Tenga en cuenta, sin embargo, que Dynamic SQL es peligroso ya que permite ataques de inyección SQL.


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)


El SQL dinámico es simplemente donde la consulta se ha creado sobre la marcha: con algunos 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 (esto es al menos vendedor neutral)


Rowland está en lo correcto, y como una adición, a menos que esté utilizando correctamente los parámetros (en lugar de simplemente concatenar los valores de los parámetros en línea desde el texto provisto, etc.) también puede ser un riesgo de seguridad. También es un oso para depurar, etc.

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