Sintaxe incorrecta perto de '=' sp_executesql
-
23-12-2019 - |
Pergunta
Eu preciso delete
todos rows
em alguns table
where
valor de seqüência de caracteres vazia.(Eu tenho vários tabela que tem o mesmo nome).
Eu tentei executar a instrução sql que está na seqüência:
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) =''
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''
exec sp_executesql @sql
Mas me jogar erro Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '='.
Eu tentei descobrir cerca de uma hora agora.Qualquer ajuda seria apreciada.
Editar:
Aqui está o que eu recebo depois de eliminar a última cota. @tableName
é nvarchar(MAX)
.
Solução
Em vez de fazer concatenação de seqüência de caracteres, parametrizar a chamada para sp_executesql
, para a Injeção de Sql e outros motivos (incluindo cache de planos de consulta, e não ter que se preocupar em escapar citações :-):
DECLARE @sql AS NVARCHAR(MAX);
DECLARE @emptyValue AS NVARCHAR(1) ='';
set @sql = N'DELETE FROM SampleTable WHERE Value=@emptyValue';
exec sp_executesql @sql, N'@emptyValue NVARCHAR(1)', @emptyValue = @emptyValue;
Outras dicas
Você tem duas citações:
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''
Altere-a para:
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue
Se você pode, eu iria com StuartLC resposta - parâmetros são claramente o caminho a percorrer.
Apenas para mostrar a você o que fazer se você não tem nenhuma escolha mas para ir por este caminho, você pode escapar as aspas simples.As aspas são necessárias, como a coluna de Valor parece ser uma seqüência de caracteres (inferido a partir de um valor padrão para @emptyValue
na pergunta).
Para escapar de uma única cotação, você precisa de outro única citação.Tentar dar um presente:
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) = ''
set @sql = N'DELETE FROM SampleTable WHERE Value='''+@emptyValue+''''
exec sp_executesql @sql
Observação você pode sempre PRINT @sql
para ver o script, em vez de cegamente tentando executá-lo.