我正在使用 dbWarden (https://www.sqlservercentral.com/articles/dbwarden-a-free-sql-server-monitoring-package-3) 进行 SQL 监控,并希望将某些进程排除在外基于排除列表的“长时间运行查询”作业。我试图在表中列出一堆 SQL_TEXT 字符串,这些字符串应该从 WHERE 子句的查询中排除。
我正在编辑的过程部分如下所示:
DECLARE @exclusions NVARCHAR (MAX);
SELECT @exclusions = COALESCE(@exclusions + '%''' + ' and SQL_TEXT not like ''%' + SQL_TEXT , SQL_TEXT) FROM LongRunningQueriesExclusions
SELECT * FROM QUERYHISTORY
WHERE RunTime >= 10
AND [DBName] NOT IN (SELECT [DBName] COLLATE DATABASE_DEFAULT FROM [DBATools].dbo.DatabaseSettings WHERE LongQueryAlerts = 0)
AND Formatted_SQL_Text NOT LIKE '%BACKUP DATABASE%'
AND Formatted_SQL_Text NOT LIKE '%RESTORE VERIFYONLY%'
AND Formatted_SQL_Text NOT LIKE '%ALTER INDEX%'
AND Formatted_SQL_Text NOT LIKE '%DECLARE @BlobEater%'
AND Formatted_SQL_Text NOT LIKE '%DBCC%'
AND Formatted_SQL_Text NOT LIKE '%FETCH API_CURSOR%'
AND Formatted_SQL_Text NOT LIKE '%WAITFOR(RECEIVE%'
-- MY ADDITION ------------------------------------------------------
AND SQL_TEXT not LIKE '''%' + @exclusions + '%'''
打印 @exclusions 变量时,它返回:
SP_testProc%' and SQL_TEXT not like '%SP_AnotherTestProc%' and SQL_TEXT not like '%SP_OneMoreTest
当用打印文本替换变量时,查询返回我所期望的结果,但不适用于变量本身。
有没有办法在查询的 WHERE 子句中包含带有通配符的排除列表?
您根本无法通过 sql 动态引用数据库中的对象。在这种情况下,您的
SQL_TEXT
字符串变量中有一个列名称(对象)exclusions
。
CONTAINS
这将允许您构建复杂的搜索条件,例如 CONTAINS(SQL_TEXT, '"SP_textProc*" or "*SP_AnotherTestProc*" or "*SP_OneMoreText"')
如果您执意要保留当前的逻辑,则需要将整个 SQL 语句构造为变量内部的字符串本身,然后使用
EXEC(@my_sql_string)
执行该 sql-stored-in-a-string。如果您想进一步搜索,这称为“动态 SQL”。
您可以直接从主查询中引用排除表,例如
AND NOT EXISTS
( SELECT 1
FROM LongRunningQueriesExclusions AS exc
WHERE QUERYHISTORY.SQL_TEXT LIKE CONCAT('%', exc.SQL_TEXT , '%')
)