Sintassi errata vicino a ' = ' sp_executesql
-
23-12-2019 - |
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)
.
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;
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
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.