Use SQL dinâmico com EXEC e sp-execute-sql

Concluído

O SQL dinâmico permite que você crie uma cadeia de caracteres que pode ser executada como T-SQL como uma alternativa aos procedimentos armazenados. SQL dinâmico é útil quando você não sabe certos valores até o tempo de execução.

Há duas maneiras de criar SQL dinâmico, usando:

  1. Palavras-chave EXECUTE ou EXEC .
  2. O procedimento armazenado do sistema sp_executesql.

SQL dinâmico usando EXECUTE ou EXEC

Para escrever uma instrução SQL dinâmica com EXECUTE ou EXEC, a sintaxe é:

EXEC (@string_variable);

No exemplo a seguir, declaramos uma variável chamada @sqlstring do tipo VARCHAR e, em seguida, atribuímos uma cadeia de caracteres a ela.

DECLARE @sqlstring AS VARCHAR(1000);
    SET @sqlstring='SELECT customerid, companyname, firstname, lastname 
    FROM SalesLT.Customer;'
EXEC(@sqlstring);
GO

SQL dinâmico usando Sp_executesql

Sp_executesql permite executar uma instrução T-SQL com parâmetros. Sp_executesql pode ser usado em vez de procedimentos armazenados quando você deseja passar um valor diferente para a instrução. A instrução T-SQL permanece a mesma e apenas os valores dos parâmetros são alterados. Como os procedimentos armazenados, é provável que o otimizador de consulta do SQL Server reutilize o plano de execução.

Sp_executesql usa uma instrução T-SQL como um argumento, que pode ser uma constante Unicode ou uma variável Unicode. Por exemplo, ambos os exemplos de código são válidos:

DECLARE @sqlstring1 NVARCHAR(1000);
SET @SqlString1 =
    N'SELECT TOP(10) name, listprice
    FROM SalesLT.Product
    GROUP BY name, listprice
    ORDER BY listprice DESC;'
EXECUTE sp_executesql @SqlString1;

OR

EXECUTE sp_executesql N'SELECT TOP(10) name, listprice
    FROM SalesLT.Product
    GROUP BY name, listprice
    ORDER BY listprice DESC;'

Neste exemplo, um parâmetro está sendo passado para a instrução T-SQL:

EXECUTE sp_executesql   
          N'SELECT * FROM SalesLT.Customer   
          WHERE CompanyName = @company',  
          N'@company nvarchar(128)',  
          @company = "Sharp Bikes";