2013-08-27 21 views
1

我想了解單引號如何在SQL中工作。 所有我想要實現的是在SQL中使用引號構建插入語句

INSERT INTO LOGTABLE 
      (ID, 
      ROLLNO) 
VALUES  ('E8645F55-A18C-43EA-9D68-1F9068F8A9FB', 
      28) 

這裏ID是唯一標識符字段,rollNo是一個int。

所以我有這個樣本的測試代碼:

set @query = ' 

insert into fileLog 
(
    id, 
    rollNo 
) 
values 
('+ 
'''' + NEWID() + '''' + ',' + 28 + 
')' 

print @query 

我曾嘗試單引號左,右,但沒有工作的幾個組合。如果有人能解決這個問題,我會很感激。但特別是我想知道在字符串的兩側需要多少個單引號才能得到'SQL'之類的東西。

感謝

+1

你只需要「在字符串中單曲指示'」 2''字符。例如,你可以簡化''''',''到'''',''。 – Dukeling

+1

如果您不完全瞭解SQL注入的風險,則請停止其中。 – podiluska

回答

2

(我會假設你需要動態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注入更安全,它可以讓你停止試圖找出並處理嵌入單引號串入的麻煩...

+0

感謝您花費精力解釋這些內容。評分最高的答案。 –

2

試試這個:

DECLARE @query VARCHAR(MAX) 

SET @query = ' insert into fileLog ( id,  rollNo) values (' + '''' + Cast(Newid() AS VARCHAR(100)) + '''' 
      + ',28)' 

PRINT @query 

的問題不是引號,但數據類型。
NEWID不是一個字符串,也不是數字28.

祝你好運!

+0

感謝您的幫助 –

3

我的問題是:你爲什麼使用動態SQL?這是在某些情況下很有用的技術之一,但可以輕易濫用。

至於回答你的問題,我使用的技術,以幫助減少進出SQL建設的翻轉:

DECLARE @query VARCHAR(MAX) 

SET @query = ' 

insert into fileLog 
(
    id, 
    rollNo 
) 
values 
(''|NEWID|'', |INT|)' 

SET @query = REPLACE(@query, '|NEWID|', NEWID()) 
SET @query = REPLACE(@query, '|INT|', 28) 


PRINT @query 
+0

感謝您教授這項技術。我使用的是動態SQL,因爲主插入更復雜,因爲我使用openrowset以及其他幾列來插入pdf文件。 –

2

除非你需要動態SQL出於某種原因,你可能只是這樣做:

insert into fileLog 
(
    id, 
    rollNo 
) 
values 
(
    NEWID(), 
    28 
)