[MSSQL] 使用LIKE查詢注意事項

  • 9405
  • 0

摘要:[MSSQL] 使用LIKE查詢注意事項

前幾天測試同事的程式時發現一個問題: 程式暫存的資料在執行完一個Stored Procedure後全被清空

檢查以後發現是由於同事很好心的在暫存資料中加入了一個標籤來做訊息的分類,且每個標籤都使用中括號[]存放

例如: [ERROR TYPE] This is an error!!

兇手則是這句 -> DELETE FROM [TABLE] WHERE [COL] LIKE '%[ERROR TYPE1]%'

我們可從以下的參考連結 -> LIKE (Transact-SQL) 找出問題所在

在此使用以下的簡單範例說明:

 

DECLARE @Test TABLE(A VARCHAR(20))
INSERT INTO @Test(A) VALUES('[ERROR TYPE1]'),('[ERROR TYPE2]'),('[ERROR TYPE3]')
SELECT * FROM @Test WHERE A LIKE '%[ERROR TYPE1]%'  --錯誤
SELECT * FROM @Test WHERE A LIKE '%[ERROR TYPE1]%' ESCAPE '['  --正確
SELECT * FROM @Test WHERE A LIKE '%[ [ ]ERROR TYPE1]%'  --正確

 

主要是因為中括號的 "[" 在SQL代表逸出序列(Escape Sequences)

因此要做些特別處理才能夠忽略它在SQL語法裡的特殊意義

 

目前就我所知有兩種處理方式:

 

1. 利用"ESCAPE" 關鍵字,提示要忽略的字元, 如:

SELECT * FROM @Test WHERE A LIKE '%[ERROR TYPE1]%' ESCAPE '['  --正確

 

2. 利用中括號把要忽略其意義的字元包起來, 如:

SELECT * FROM @Test WHERE A LIKE '%[ [ ]ERROR TYPE1]%'  --正確

 

參考微軟說明: