1: Instruções SQL comuns podem ser executadas com exec
Selecione * a partir do tableName exec('select * de NomeTabela') exec sp_executesql N'select * from tableName' -- Note que você deve adicionar N antes da string
2: Ao usar nomes de campos, nomes de tabelas, nomes de banco de dados, etc. como variáveis, SQL dinâmico deve ser usado
declare @fname Varchar(20) set @fname = 'Nome Arquivado' Selecione @fname em tableName -- Erro, nenhum erro é solicitado, mas o resultado é um valor fixo FiledName, que não é o que você quer. exec('select ' + @fname + ' from tableName') — note que um espaço é adicionado ao lado da aspas simples antes e depois do sinal de mais
Claro, você também pode mudar a sequência para a forma de uma variável declare @fname Varchar(20) definir @fname = 'NomeDeFileiado' --Definir o nome do campo
declare @s varchar(1000) defina @s = 'selecionar' + @fname + ' a partir do NomeDa Mesa' Executivo(@s) -- Sucesso executivo sp_executesql @s -- Esta frase reportará um erro
declare @s Nvarchar(1000) — note que aqui é alterado para nvarchar(1000). defina @s = 'selecionar' + @fname + ' a partir do NomeDa Mesa' Executivo(@s) -- Sucesso Executivo sp_executesql @s -- Esta frase está correta
3. Parâmetros de saída declarar @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' executivo(@sqls)
--como faço para colocar o resultado da execução executiva em uma variável?
declarar @num int, @sqls nvarchar(4000) Set @sqls='Select @a=count(*) from tableName ' exec sp_executesql @sqls,N'@a int output',@num output selecione @num
1: Instruções SQL comuns podem ser executadas com Exemplo Executivo: Selecione * a partir do tableName Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- Note que você deve adicionar N antes da string
2: Ao usar nomes de campos, nomes de tabelas, nomes de banco de dados, etc. como variáveis, SQL dinâmico deve ser usado
Erro: declarar @fname varchar(20) set @fname = 'Nome Arquivado' Selecione @fname em tableName -- Erro, nenhum erro é solicitado, mas o resultado é um valor fixo FiledName, que não é o que você quer. Correto: Exec('select ' + @fname + ' do tableName') — note a adição de um espaço ao lado da aspas simples antes e depois do sinal de mais
Claro, você também pode mudar a sequência para a forma de uma variável declare @fname Varchar(20) definir @fname = 'NomeDeFileiado' --Definir o nome do campo
declare @s varchar(1000) defina @s = 'selecionar' + @fname + ' a partir do NomeDa Mesa' Executivo(@s) -- Sucesso executivo sp_executesql @s -- Esta frase reportará um erro
--Nota: @s parâmetro deve ser do tipo ntext, nchar ou nvarchar, declare @s varchar(1000) deve ser alterado para declarar @s nvarchar(1000)
Conforme segue: declare @s Nvarchar(1000) — note que aqui é alterado para nvarchar(1000).
definir @fname = 'NomeDeFileiado' --Definir o nome do campo defina @s = 'selecionar' + @fname + ' a partir do NomeDa Mesa' Executivo(@s) -- Sucesso Executivo sp_executesql @s -- Esta frase está correta
3. Parâmetros de entrada ou saída
(1) Parâmetros de entrada: declare @QueryString nvarchar(1000) -- variável dinâmica da instrução de consulta (nota: deve ser do tipo ntext ou nchar nvarchar, não do tipo varchar) Declare @paramstring nvarchar(200) - defina a cadeia de parâmetros na instrução dinâmica (nota: deve ser do tipo ntext ou nchar nvarchar, não do tipo varchar) declare @input_id int - define o valor dos parâmetros a serem passados na instrução dinâmica
defina @QueryString='selecione * do nome da tabela onde id=@id' --id é o nome do campo, @id é o parâmetro a ser passado define @paramstring='@id int' -- Define a string que define os parâmetros na instrução dinâmica definir @input_id =1 -- Definir o valor do parâmetro a ser passado na instrução dinâmica para 1 exec sp_executesql @querystring,@paramstring,@id=@input_id Se houver múltiplos parâmetros: declare @QueryString nvarchar(1000) -- variável dinâmica da instrução de consulta (nota: deve ser do tipo ntext ou nchar nvarchar, não do tipo varchar) Declare @paramstring nvarchar(200) - defina a cadeia de parâmetros na instrução dinâmica (nota: deve ser do tipo ntext ou nchar nvarchar, não do tipo varchar) declare @input_id int - define o valor do parâmetro a ser passado para a instrução dinâmica, parâmetro 1 Declare @input_name varchar(20) - define o valor do argumento a ser passado para a afirmação dinâmica, parâmetro 2
Defina @QueryString='selecione * do nome da tabela onde id=@id e nome=@name' --id e nome são nomes de campo, e @id e @name são os parâmetros a serem passados Defina @paramstring='@id int,@name varchar(20)' -- Defina a cadeia da definição dos parâmetros na instrução dinâmica, separada por "," definir @input_id =1 -- Definir o valor do parâmetro a ser passado na instrução dinâmica para 1 defina @input_name='Zhang San' --Defina o valor do parâmetro a ser passado na instrução dinâmica para 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Note a ordem dos argumentos (2) Parâmetros de saída declarar @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' executivo(@sqls) --como faço para colocar o resultado da execução executiva em uma variável? declare @QueryString nvarchar(1000) -- variável dinâmica do nome da consulta (Nota: deve ser do tipo ntext ou nchar nvarchar, não do tipo varchar) Declare @paramstring nvarchar(200) - defina a cadeia de parâmetros na instrução dinâmica (nota: deve ser do tipo ntext ou nchar nvarchar, não do tipo varchar) declare @output_result int - o resultado da consulta é atribuído ao @output_result
Defina @QueryString='selecione @totalcount=count(*) do nome da tabela' --@totalcount é o parâmetro de saída defina @paramstring='@totalcount int output' --Defina a string definida pelos parâmetros na instrução dinâmica, separada por "," exec sp_executesql @querystring,@paramstring,@totalcount=@output_result saída selecione @output_result Claro, os parâmetros de entrada e saída podem ser usados juntos, então você pode tentar por conta própria. Além disso, se você quiser gerar o conjunto de resultados da consulta dinâmica da instrução, penso apenas no seguinte método de usar tabelas temporárias, não sei se você tem uma forma melhor. SE object_id('[tempdb].[ dbo].#tmp') NÃO É NULO -- Determine se a tabela temporária #tmp existe, e se existir, delete-a #tmp drop table selecione * em #tmp a partir do nome da tabela onde 1=2 -- Crie uma #tmp temporária da tabela com a mesma estrutura do nome da tabela
declare @QueryString nvarchar(1000) -- variável dinâmica do nome da consulta (Nota: deve ser do tipo ntext ou nchar nvarchar, não do tipo varchar) Set @QueryString='Select * do nome da tabela ' inserir em #tmp(field1,field2,...) exec(@querystirng) |