Sql-Server
在擴展事件過濾器上使用方括號
我想創建一個擴展的事件會話並使用
like_i_sql_unicode_string
運算符過濾片語[demo]
,用方括號。我開始了:CREATE EVENT SESSION [demo] ON SERVER ADD EVENT sqlserver.sql_batch_completed( WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%[demo]%')) ) ADD TARGET package0.ring_buffer alter event session [demo] on server state=start
但這解釋
[demo]
為類似正則表達式的語法上的字元組。所以如果我執行這個:-- m
它將在擴展事件中被擷取。
我得到的最接近的是稍後過濾它,
[sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%demo%')
在過濾器上使用,然後:SELECT n.ev.value('@timestamp','datetimeoffset') as [timestamp], n.ev.value('data[@name="batch_text"][1]','varchar(max)') as [batch_text] FROM sys.dm_xe_session_targets xet INNER JOIN sys.dm_xe_sessions xe ON xe.[address] = xet.event_session_address cross apply (select CONVERT(XML, target_data) as xData ) as x cross apply x.xData.nodes(N'RingBufferTarget/event') AS n(ev) WHERE xe.name = N'demo' AND xet.target_name = N'ring_buffer' and n.ev.value('data[@name="batch_text"][1]','varchar(max)') like '%\[demo\]%' escape '\'
但這仍然擷取了不必要的事件。
我試過
'%[[]demo[]]%'
,'%{[}demo{]}%'
,'%\[demo\]%'
,'%$[demo$]%'
,但沒有一個奏效。
這很有挑戰性。
WHERE [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%[[]demo]%')
在測試時,即使是左括號也被視為$$ $$(萬用字元 - 要匹配的字元
所以條件的第一部分嵌套了左括號。
單獨的右括號不被辨識為特殊字元,因此無需額外注意。
這兩個條件一起圍繞搜尋的文本。
這記錄在LIKE (Transact-SQL)文件中的Using Wildcard Characters As Literals下(強調添加):
您可以將萬用字元模式匹配字元用作文字字元。要將萬用字元用作文字字元,請將萬用字元括在方括號中。下表顯示了使用 LIKE 關鍵字和
$$ $$萬用字元。
測試
SELECT ('a_demo_a') GO SELECT ('a_[demo_a') GO SELECT ('a_demo]_a') GO SELECT ('a_[demo]_a') GO SELECT ('m') GO SELECT ('a_[[demo]_a')