Consultas Dinâmicas – SQL Server

A instrução dinâmica SQL é construída em tempo de execução, para o qual geram difrentes comando SQL. Instruções dinâmicas podem ser úteis para decisão de declarações em tempo de execução, ou seja, em tempo de execução você pode definir quais campos retornar a partir de algumas instruções, entre elas o SELECT com critérios diferentes para sua consulta e talvez diferentes tabelas para consulta com base em diferentes condições.

Essas seqüências no SQL não são analisadas por erro, porque eles são gerados em tempo de execução. Eles podem aprensentar insegurança no banco de dados. E um dos maiores problemas é a depuração, um pesadelo saber qual string que está com erro! Por isto, instruções dinâmicas são perfeitas para alguns casos. Em alguns casos, critérios adicionais são necessários, como tabelas e aumentando, de critérios mais e mais muitas vezes é necessário. Isso normalmente pode ser resolvido “por escrito” em diferentes procedimentos armazenados para diferentes critérios, só que algumas vezes os critérios são tão diferentes para cada execuação que pode abrangir todas as possibilidades em um procedimento armazenado é um incômodo.

Existem duas formas de executar a SQL dinâmica no SQL Server: o uso do sistema sp_executesql procedimento armazenado ou o execute () do operador. Às vezes os dois métodos podem produzir o mesmo resultado, mas existem diferenças na forma como eles se comportam.

O sistema sp_executesql procedimento armazenado permite parâmetros a serem passados dentro e fora da instrução SQL dinâmica, enquanto EXECUTE () não. Como a instrução SQL é passada para o procedimento armazenado sp_executesql como um parâmetro, é menos vunerável a “ataques” do SQL do EXECUTE (). Desde sp_executesql é um procedimento armazenado, passando strings SQL para isso resultará em uma maior probabilidade de que a seqüência SQL permanecerá em cache, o que deverá levar a um melhor desempenho quando a mesma instrução SQL é executado novamente. Na minha opinião, os resultados sp_executesql em código que é muito mais limpo e mais fácil de ler e manter. Estas razões são porque sp_executesql é a melhor maneira de executar instruções SQL dinâmicas.

Para executar os testes, vamos executar os seguintes scripts:

Use [master]
GO

CREATE TABLE TBL_PESQ_DINAMICA
(
	 codId		int
	,nome		varchar(20)
	,idade		int
)

DECLARE @iAux	INT
DECLARE @iIdade INT

Set @iAux = 1
Set @iIdade = 15

While @iAux < 15
Begin
Set @iIdade = @iIdade + 1
	INSERT INTO TBL_PESQ_DINAMICA VALUES(@iAux, 'TESTE_' + Convert(char,@iAux), @iIdade)
	Set @iAux = @iAux + 1
End

-- Executando consulta dinâmica usando o comando EXEC
DECLARE @Tabela NVARCHAR(50)
SET @Tabela = 'master.dbo.TBL_PESQ_DINAMICA'
EXEC (N'SELECT * FROM ' + @Tabela)

-- Executando consulta dinâmica usando o comando EXEC 2
DECLARE @Tabela NVARCHAR(50)
DECLARE @Query  NVARCHAR(50)
SET @Tabela = 'master.dbo.TBL_PESQ_DINAMICA'
SET @Query = N'SELECT * FROM ' + @Tabela

EXEC (@Query)

-- Executando consultas dinâmicas usando a Stored Procedure sp_executesql
DECLARE @Tabela NVARCHAR(50)
DECLARE @Query  NVARCHAR(50)
SET @Tabela = 'master.dbo.TBL_PESQ_DINAMICA'
SET @Query = N'SELECT * FROM ' + @Tabela
SELECT @Query
EXEC sp_executesql @Query

-- Gerando query dinâmica utilizando variáveis como parâmetro
DECLARE @Query NVARCHAR(150)
DECLARE @iIdade INT
DECLARE @Tabela NVARCHAR(50)

SET @Tabela = 'model.dbo.TBL_PESQ_DINAMICA'
SET @iIdade = 16
SET @Query = N'SELECT * FROM ' + @Tabela + ' WHERE idade = ' + Convert(char,@iIdade)

SELECT @Query
EXEC (@Query)

-- Executando query's dinâmicas com parâmetros de entrada usando sp_executesql
DECLARE @Query NVARCHAR(150)
DECLARE @iIdade INT
DECLARE @Tabela NVARCHAR(50)

SET @Tabela = 'master.dbo.TBL_PESQ_DINAMICA'
SET @iIdade = 17
SET @Query = N'SELECT * FROM ' + @Tabela + ' WHERE idade = @iIdade '

SELECT @Query
EXEC sp_executesql @Query, N'@iIdade char(2)', @iIdade

É isso aí!

Alan Machado

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s