Eu me encarei cegamente com isso. Começou como um procedimento mais complexo, mas eu o reduzi ao mínimo, tentando fazê-lo funcionar. Este é o código atual:
DECLARE @sql NVarchar(MAX) = '
CREATE PROCEDURE dbo.Test
AS
BEGIN
SELECT 1, @num;
END'
EXEC [sp_executesql] @sql, N'@num int', @num = 1;
Ele simplesmente se recusa. Vale ressaltar que, se eu executar o código sem a parte do parâmetro ( @sql
sendo o único parâmetro da sp_executesql
função), ele funcionará bem. Eu tentei outras alternativas de sintaxe, como
EXEC [sp_executesql] @sql, N'@num int', 1;
e
DECLARE @params NVarchar(1000) = '@num int';
EXEC [sp_executesql] @sql, @params, 1;
O que há de errado com minha especificação de parâmetro?
Editar 1 : mensagem de erro incluída
Msg 156, Level 15, State 1, Line 2
Incorrect syntax near the keyword 'PROCEDURE'.
Você parece estar esperando que os parâmetros acabem sendo tratados como argumentos de interpolação de strings.
Eles não vão.
Uma maneira de conseguir algo semelhante ao que você deseja seria simplesmente parametrizar o procedimento armazenado
Então, ao executá-lo, você fornece o valor desejado.
Se você definitivamente deseja que o procedimento seja
@num
substituído por um codificado1
, você pode usar.Cuide da injeção de SQL se você seguir esse caminho.
Além disso, você precisaria ter cuidado com os nomes dos espaços reservados e parâmetros e a ordem das substituições, portanto, se você tivesse espaços reservados,
@num
o@number
primeiro@number
precisaria ser substituído.Você deve evitar tornar toda a chamada dinâmica por causa da vulnerabilidade de injeção de SQL.
Seu procedimento também precisa aceitar o parâmetro que você está especificando em sua chamada sql dinâmica
A maneira correta de parametrizar seu sql dinâmico é:
A parametrização do sql dinâmico também permite que o plano no cache do procedimento seja reutilizado e é muito mais eficiente para o servidor. Se você já se deparou com sql dinâmico que não é parametrizado e não pode modificar porque está em um software de terceiros, também pode usar guias de plano.