(我會假設你需要動態SQL理由不因爲這似乎並不需要動態SQL。)
作爲@Gidil建議,這裏的問題是試圖將uniqueidentifier作爲字符串處理。在這種情況下,確實沒有任何理由在外部範圍聲明NEWID()
,因爲你可以簡單地說:
SET @query = 'INSERT ... VALUES(NEWID(), 28);';
PRINT @query;
現在,you should be using NVARCHAR(MAX)
as your parameter, because ultimately you should be executing this using sp_executesql
, not EXEC()
。
如果你需要有一個文字,你可以雙擊了引號:
DECLARE @string VARCHAR(32);
SET @string = 'foo';
SET @query = N'INSERT ... VALUES(''' + @string + ''', 28);';
但是我覺得它更具可讀性使用CHAR(39)
:
SET @query = N'INSERT ... VALUES(' + CHAR(39) + @string + CHAR(39) + ', 28);';
更妙的是沒有追加這些變量無論如何都是一個字符串。應儘可能使用正確的輸入參數。
DECLARE @query NVARCHAR(MAX);
DECLARE @string VARCHAR(32), @newid UNIQUEIDENTIFIER, @id INT;
SELECT @string = 'foo', @newid = NEWID(), @id = 28;
SET @query = N'INSERT ... VALUES(@string, @newid, @id);';
EXEC sp_executesql @query,
N'@string VARCHAR(32), @newid UNIQUEIDENTIFIER, @id INT',
@string, @newid, @id;
這是笨重的,肯定的,但它是從SQL注入更安全,它可以讓你停止試圖找出並處理嵌入單引號串入的麻煩...
你只需要「在字符串中單曲指示'」 2''字符。例如,你可以簡化''''',''到'''',''。 – Dukeling
如果您不完全瞭解SQL注入的風險,則請停止其中。 – podiluska