Sql-Server

在擴展事件過濾器上使用方括號

  • August 27, 2022

我想創建一個擴展的事件會話並使用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')

結果 在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/316116