在扩展事件过滤器上使用方括号

Jor*_*gal 5 sql-server syntax extended-events operator like

我想创建一个扩展事件会话,并使用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
Run Code Online (Sandbox Code Playgroud)

但这会解释[demo]为类似正则表达式的语法上的字符组。所以如果我运行这个:

-- m
Run Code Online (Sandbox Code Playgroud)

它将在扩展事件中捕获。

我得到的最接近的是稍后过滤它,使用[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 '\'
Run Code Online (Sandbox Code Playgroud)

但这仍然捕获了超出必要数量的事件。

我已经尝试过,,,,'%[[]demo[]]%'但这些'%{[}demo{]}%'都不起作用。'%\[demo\]%''%$[demo$]%'

Zik*_*ato 8

这很有挑战性。

WHERE 
    [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%[[]demo]%')
Run Code Online (Sandbox Code Playgroud)

测试时,甚至左括号也被视为[ ] (通配符 - 要匹配的字符)

因此,条件的第一部分嵌套了左括号。
单独的右括号不会被识别为特殊字符,因此无需额外注意。

这两个条件一起围绕搜索的文本。

这在LIKE (Transact-SQL)文档中的“使用通配符作为文字”下进行了记录(已添加强调):

您可以使用通配符模式匹配字符作为文字字符。要将通配符用作文字字符,请将通配符括在方括号中。下表显示了使用 LIKE 关键字和 [ ] 通配符的几个示例。

象征 意义
喜欢“5[%]” 5%
喜欢“[_]n” _n
喜欢“[a-cdf]” a、b、c、d 或 f
喜欢“[-acdf]” -、a、c、d 或 f
喜欢 '[ [ ]' [
喜欢 ']' ]
喜欢“abc[_]d%” abc_d 和 abc_de
喜欢“abc[def]” abcd、abce 和 abcf

测试

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')
Run Code Online (Sandbox Code Playgroud)

结果 在此输入图像描述