在 where 子句中使用变量进行 SQL 查询以进行排除

问题描述 投票:0回答:2

我正在使用 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 + '%'''

我的排除表有以下我想排除的过程: LongRunningQueriesExclusions Table

打印 @exclusions 变量时,它返回:

SP_testProc%' and SQL_TEXT not like '%SP_AnotherTestProc%' and SQL_TEXT not like '%SP_OneMoreTest

当用打印文本替换变量时,查询返回我所期望的结果,但不适用于变量本身。

有没有办法在查询的 WHERE 子句中包含带有通配符的排除列表?

sql-server t-sql where-clause dynamic-sql
2个回答
0
投票

您根本无法通过 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”。


0
投票

您可以直接从主查询中引用排除表,例如

AND NOT EXISTS
    (   SELECT  1
        FROM    LongRunningQueriesExclusions AS exc
        WHERE   QUERYHISTORY.SQL_TEXT LIKE CONCAT('%', exc.SQL_TEXT , '%')
    )
© www.soinside.com 2019 - 2024. All rights reserved.