我想创建一个扩展的事件会话并使用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$]%'
,但没有一个奏效。
这很有挑战性。
测试时,即使是左括号也被视为[ ] (通配符 - 要匹配的字符
所以条件的第一部分嵌套了左括号。
单独的右括号不被识别为特殊字符,因此无需额外注意。
这两个条件一起围绕搜索的文本。
这记录在LIKE (Transact-SQL)文档中的Using Wildcard Characters As Literals下(强调添加):
测试
结果