有人可以解釋爲什麼我不得不在這裏輸入10個單引號只是爲了讓它在列中存儲''?我試圖理解其中的邏輯來這個..爲什麼我必須輸入這麼多的單引號才能在動態sql中轉義引號?
exec('UPDATE [SomeTable] SET [SomeColumn] = '''''''''''', [AnotherColumn] = Null ')
我不停地加上引號,直到我得到了想要的輸出,我想,但現在我想知道我爲什麼把這麼多的報價。
有人可以解釋爲什麼我不得不在這裏輸入10個單引號只是爲了讓它在列中存儲''?我試圖理解其中的邏輯來這個..爲什麼我必須輸入這麼多的單引號才能在動態sql中轉義引號?
exec('UPDATE [SomeTable] SET [SomeColumn] = '''''''''''', [AnotherColumn] = Null ')
我不停地加上引號,直到我得到了想要的輸出,我想,但現在我想知道我爲什麼把這麼多的報價。
插入「」到表看起來像這樣的代碼:
UPDATE [SomeTable] SET [SomeColumn] = '''''', [AnotherColumn] = Null
但是,因爲你在執行此另一個字符串中,你需要躲避轉義引號,導致你給的代碼。
您需要/有十二個引號。字符串中的每個引號都會被第二個引號轉義。你通常需要做set column = ''''''
,但由於它本身是在一個字符串中,所以每個逃脫的報價都應該加倍,從而得到十二個報價。
如果您實際上想要將''
存儲在數據庫中而不必轉義它,您可以始終使用等效(CHAR(39)
)(儘管我不確定您的意圖是存儲空字符串還是實際存儲兩個單一字符串引號):
EXEC('
DECLARE @x TABLE(x VARCHAR(10));
INSERT @x SELECT CHAR(39) + CHAR(39);
SELECT x FROM @x;
');
我通常做這樣的事情,以避免級聯和單引號的醜陋嵌套構建動態SQL時:
DECLARE @sql NVARCHAR(MAX) = N'';
SET @sql = 'SELECT foo = $sq$bar$sq$;';
SET @sql = REPLACE(@sql, '$sq$', CHAR(39));
SELECT @sql;
EXEC sp_executesql @sql;
不,這不會使這個特定的情況下,任何更多當然,當你用大字符串多次引用相同的數據庫,表或列時,替換標記($db$
,$table$
等)比處理所有其他串聯混亂更好。恕我直言。
很好地使用REPLACE函數的確是和肯定的事情要考慮我的下一個冒險與動態sql。我沒有把這個標記爲答案的唯一原因是因爲雖然聰明,但它並沒有回答手頭的問題。 – CheckRaise 2012-02-14 17:53:16
當然,但如果你將你的問題解釋爲「如果沒有所有這些單引號,我該怎麼做?」這可能是...... – 2012-02-14 18:03:57