Domanda

Ho bisogno di delete tutto rows in alcuni table where il valore è una stringa vuota.(Ho più tabelle che hanno un nome simile).

Ho provato a eseguire quelle istruzioni sql che sono in stringa:

DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) =''    
set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''
exec sp_executesql @sql

Ma è un errore Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '='.

Ho provato a capirlo per circa un'ora.Qualsiasi aiuto sarebbe apprezzato.

Modificare: Ecco cosa ottengo dopo aver eliminato l'ultima quota. @tableName essere nvarchar(MAX). enter image description here

È stato utile?

Soluzione

Invece di fare concatenazione di stringhe, parametrizzare la chiamata a sp_executesql, per Sql Injection e altri motivi (incluso il caching dei piani di query, e non doversi preoccupare di sfuggire alle virgolette: -):

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

Altri suggerimenti

Hai due citazioni:

set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue+''

Cambia in:

set @sql = N'DELETE FROM SampleTable WHERE Value='+@emptyValue

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

Se puoi, ci andrei La risposta di StuartLC - i parametri sono chiaramente la strada da percorrere.

Solo per mostrarti cosa fare se non hai altra scelta che andare in questo modo, puoi sfuggire alle virgolette singole.Le virgolette sono necessarie in quanto la colonna Valore sembra essere una stringa (dedotta dal valore predefinito impostato su @emptyValue nella domanda).

Per evitare una singola citazione, è necessario un altro singolo preventivo.Fare questo un tentativo:

DECLARE @sql AS NVARCHAR(MAX)
DECLARE @emptyValue AS NVARCHAR(1) = ''
set @sql = N'DELETE FROM SampleTable WHERE Value='''+@emptyValue+''''
exec sp_executesql @sql

Nota si potrebbe sempre PRINT @sql per vedere lo script, piuttosto che cercare ciecamente di eseguirlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top