2014-02-27 46 views
3

我需要delete所有rows在一些tablewhere值是空字符串(我有多個表名稱相似)。'='附近的語法錯誤sp_executesql

我tryed執行這些SQL語句是字符串:

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

但它把我的錯誤Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '='.

我tryed現在弄明白大約一個小時。 任何幫助,將不勝感激。

編輯: 這是我刪除最後一個配額後得到的。 @tableNamenvarchar(MAX)enter image description here

回答

5

而不是做字符串連接,parameterize調用sp_executesql,SQL注入和其他原因(包括緩存查詢計劃,而不必擔心約:-)轉義引號:

DECLARE @sql AS NVARCHAR(MAX); 
DECLARE @emptyValue AS NVARCHAR(1) =''; 
set @sql = N'DELETE FROM SampleTable WHERE [email protected]'; 
exec sp_executesql @sql, N'@emptyValue NVARCHAR(1)', @emptyValue = @emptyValue; 

Fiddle

+0

如果他必須使用exec,那麼這是最好的辦法。 –

1

你有兩個報價:

set @sql = N'DELETE FROM SampleTable WHERE Value='[email protected]+'' 

將其更改爲:

set @sql = N'DELETE FROM SampleTable WHERE Value='[email protected] 

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

+0

最後,我的腳本的其餘部分被視爲字符串。 – harry180

+0

@ harry180 - 你有兩個單引號。你只需要一個。我已經包含一個SQL小提琴來演示我的代碼工作。 –

+0

@DarrenDavies看起來你的SQLFiddle中的內容與你在這裏發佈的代碼不一樣。從你的小提琴:'set @sql = N'DELETE FROM SampleTable WHERE Value ='+ @ emptyValue +''' - 注意最後兩個引號,而不是一個。 – Bridge

0

如果可以的話,我會跟StuartLC's answer去 - 參數顯然是要走的路。

只是爲了告訴你如果你別無選擇,只能這樣做,你可以逃避單引號。引號是必需的,因爲「值」列顯示爲字符串(由問題中的默認值設置爲@emptyValue推斷)。

要轉義單引號,您需要另一個單引號。試試這個:

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

注意你總是可以PRINT @sql看到劇本,而不是一味地試圖運行它。