首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 單引號巢狀逃脫規則:動態 SQL 與預存程序參數中正確處理單引號

     編輯:關於SqlServer

動態 SQL、預存程序參數、字串常值中出現單引號時,SQL Server 使用雙單引號 ('') 作為逃脫字元,而非反斜線。本文說明正確寫法與常見錯誤。

錯誤示範

-- 錯誤:單引號直接巢狀,解析器誤判字串結束
@condition = 'ROOMTYPE LIKE ''%標準間%'''  -- 紅色部分會報錯

正確寫法:雙單引號逃脫

-- 正確:單引號內部用兩個單引號代表一個單引號字元
@condition = 'ROOMTYPE LIKE ''''%標準間%'''''

-- 解析後實際傳遞給執行的字串:
-- ROOMTYPE LIKE '%標準間%'

實戰範例:動態 SQL 建構

DECLARE @sql NVARCHAR(MAX), @name NVARCHAR(50) = N'張三''s Book';  -- 變數宣告也用雙單引號

SET @sql = N'SELECT * FROM Books WHERE Author = ''' + REPLACE(@name, '''', '''''') + N'''';
-- @sql 內容: SELECT * FROM Books WHERE Author = '張三''s Book'

EXEC sp_executesql @sql;

關鍵原則

  1. 字串常值中:'It''s OK' → 實際字串 It's OK。
  2. 動態 SQL 拼接:用 REPLACE(@var, '''', '''''') 將變數內單引號加倍。
  3. 預存程序參數:呼叫端傳參時同樣需加倍,或使用參數化查詢 (sp_executesql) 完全避免拼接。

參數化查詢:根本避免單引號問題

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM Books WHERE Author = @author';
EXEC sp_executesql @sql, N'@author NVARCHAR(50)', @author = @name;
-- 無需任何逃脫處理,最安全、效能最佳 (計畫重用)

速查表

情境輸入SQL 中寫法實際值
字串常值含單引號O'Reilly'O''Reilly'O'Reilly
動態 SQL 字串拼接變數 @v = 'O''Reilly'REPLACE(@v, '''', '''''')O''Reilly (在動態 SQL 中再次逃脫)
預存程序字串參數EXEC sp 'O''Reilly'呼叫端加倍O'Reilly

牢記:SQL Server 單引號逃脫 = 雙單引號,拒絕反斜線、拒絕雙引號,動態 SQL 首選參數化查詢徹底消除注入與逃脫風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved