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). enter image description here

Foi útil?

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;

Violino

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

http://sqlfiddle.com/#!3/ce8e3/4

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top