1: Las sentencias SQL ordinarias pueden ejecutarse con exec
Seleccionar * de tableName exec('select * desde tableName') exec sp_executesql N'select * de tableName' -- Ten en cuenta que debes añadir N antes de la cadena
2: Al usar nombres de campos, nombres de tablas, nombres de bases de datos, etc. como variables, debe emplearse SQL dinámico
Declara @fname Varchar(20) set @fname = 'NombreDeArchivado' Selecciona @fname desde tableName -- Error, no aparece ningún error, pero el resultado es un valor fijo FiledName, que no es lo que quieres. exec('select ' + @fname + ' de tableName') -- nota que se añade un espacio al lado de la comilla antes y después del signo más
Por supuesto, también puedes cambiar la cadena a la forma de una variable Declara @fname Varchar(20) establecer @fname = 'NombreFiled' --Establecer el nombre del campo
declara @s varchar (1000) establecer @s = 'seleccionar' + @fname + ' desde tableName' Ejecutivo(@s) -- éxito ejecutivo sp_executesql @s -- Esta frase informará de un error
Declara @s Nvarchar(1000) — ten en cuenta que aquí se cambia a nvarchar(1000). establecer @s = 'seleccionar' + @fname + ' desde tableName' Ejecutivo(@s) -- éxito Ejecutivo sp_executesql @s -- Esta frase es correcta
3. Parámetros de salida declarar @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' ejecutivo(@sqls)
--¿cómo pongo el resultado de la ejecución ejecutiva en una variable?
declarar @num int, @sqls nvarchar(4000) set @sqls='select @a=count(*) from tableName ' salida ejecutiva sp_executesql @sqls,N'@a int output',@num salida Seleccionar @num
1: Las sentencias SQL ordinarias pueden ejecutarse con Exec Ejemplo: Seleccione * desde tableName Exec('select * desdeNombreTable') Exec sp_executesql N'select * from tableName' -- Ten en cuenta que debes añadir N antes de la cadena
2: Al usar nombres de campos, nombres de tablas, nombres de bases de datos, etc. como variables, debe emplearse SQL dinámico
Error: declarar @fname varchar(20) set @fname = 'NombreDeArchivado' Selecciona @fname desde tableName -- Error, no aparece ningún error, pero el resultado es un valor fijo FiledName, que no es lo que quieres. Correcto: Exec('select ' + @fname + ' de tableName') — fíjate en la suma de un espacio al lado de la comilla simple antes y después del signo de más
Por supuesto, también puedes cambiar la cadena a la forma de una variable Declara @fname Varchar(20) establecer @fname = 'NombreFiled' --Establecer el nombre del campo
declara @s varchar (1000) establecer @s = 'seleccionar' + @fname + ' desde tableName' Ejecutivo(@s) -- Éxito ejecutivo sp_executesql @s -- Esta frase informará de un error
--Nota: @s parámetro debe ser de tipo ntext o nchar o nvarchar, declare @s varchar(1000) debe cambiarse para declarar @s nvarchar(1000)
De la siguiente manera: Declara @s Nvarchar(1000) — ten en cuenta que aquí se cambia a nvarchar(1000).
establecer @fname = 'NombreFiled' --Establecer el nombre del campo establecer @s = 'seleccionar' + @fname + ' desde tableName' Ejecutivo(@s) -- Éxito Ejecutivo sp_executesql @s -- Esta frase es correcta
3. Parámetros de entrada o salida
(1) Parámetros de entrada: declare @QueryString nvarchar(1000) -- variable dinámica de la instrucción de consulta (nota: debe ser de tipo ntext o nchar nvarchar, no de tipo varchar) Declarar @paramstring nvarchar(200) - establecer la cadena de parámetros en la sentencia dinámica (nota: debe ser de tipo ntext o nchar nvarchar, no tipo varchar) declare @input_id int - define el valor de los parámetros que se pasarán a la sentencia dinámica
Establece @QueryString='Select * de nombre de tabla donde id=@id' --id es el nombre del campo, @id es el parámetro a pasar set @paramstring='@id int' -- Establece la cadena que define los parámetros en la sentencia dinámica establecer @input_id =1 -- Establecer el valor del parámetro a pasar en la sentencia dinámica en 1 ejecutiva sp_executesql @querystring,@paramstring,@id=@input_id Si hay múltiples parámetros: declare @QueryString nvarchar(1000) -- variable dinámica de la instrucción de consulta (nota: debe ser de tipo ntext o nchar nvarchar, no de tipo varchar) Declarar @paramstring nvarchar(200) - establecer la cadena de parámetros en la sentencia dinámica (nota: debe ser de tipo ntext o nchar nvarchar, no tipo varchar) declare @input_id int - define el valor del parámetro que se va a pasar a la sentencia dinámica, parámetro 1 Declare @input_name varchar(20) - define el valor del argumento que se va a pasar a la sentencia dinámica, parámetro 2
Establece @QueryString='Select * de Nombre de la Tabla donde ID=@id y Nombre=@name' --id y nombre son nombres de campo, y @id y @name son los parámetros que se deben pasar Establecer @paramstring='@id int,@name varchar(20)' -- Establecer la cadena de la definición de los parámetros en la sentencia dinámica, separada por "," establecer @input_id =1 -- Establecer el valor del parámetro a pasar en la sentencia dinámica en 1 establece @input_name='Zhang San' --Establece el valor del parámetro que se va a pasar en la sentencia dinámica a 'Zhang San' ejecutiva sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Observa el orden de los argumentos (2) Parámetros de salida declarar @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' ejecutivo(@sqls) --¿cómo pongo el resultado de la ejecución ejecutiva en una variable? declare @QueryString nvarchar(1000) -- variable dinámica de nombre de consulta (Nota: debe ser de tipo ntext o nchar nvarchar, no tipo varchar) Declarar @paramstring nvarchar(200) - establecer la cadena de parámetros en la sentencia dinámica (nota: debe ser de tipo ntext o nchar nvarchar, no tipo varchar) declara @output_result int - el resultado de la consulta se asigna al @output_result
Set @QueryString='Select @totalcount=count(*) from tablename' --@totalcount es el parámetro de salida establecer @paramstring='@totalcount int output' --Establecer la cadena definida por los parámetros en la instrucción dinámica, separada por "," Exec sp_executesql @querystring,@paramstring,@totalcount=@output_result salida Selecciona @output_result Por supuesto, los parámetros de entrada y salida pueden usarse juntos, así que puedes probarlo tú mismo. Además, si quieres generar el conjunto de resultados de la consulta de la sentencia dinámica, solo pienso en el siguiente método de usar tablas temporales, no sé si tienes una mejor opción. SI object_id('[tempdb].[ dbo].#tmp') NO ES NULO -- Determina si la tabla temporal #tmp existe y, si existe, elimínala Tabla de #tmp seleccionar * en #tmp desde nombre de tabla donde 1=2 -- Crea un #tmp temporal de tabla con la misma estructura que nombre de tabla
declare @QueryString nvarchar(1000) -- variable dinámica de nombre de consulta (Nota: debe ser de tipo ntext o nchar nvarchar, no tipo varchar) Set @QueryString='Select * de nombre de la tabla ' insertar en #tmp(field1,field2,...) exec(@querystirng) |