我们试图排除名称类似于“%backup%”或“%WI%”的存储过程。
这是我使用的总查询..
;WITH CTE
AS
(select object_name(object_id) as procname
from sys.sql_modules
where definition LIKE '%CTLEMPLOYEE%' and ( object_name(object_id) NOT LIKE '%BACKUP%'
or object_name(object_id) not like '%backup%'
OR object_name(object_id) NOT LIKE '%Wi%')
)
SELECT * FROM CTE
Run Code Online (Sandbox Code Playgroud)
上述查询的示例输出:
report_spBIHRRecruitmentReport_Phase2_backup
但奇怪的是上面的查询返回结果仍然有名字
一样
。备份
2.Wi
然后我尝试使用 collate 来限制结果之类的结果..
;WITH CTE
AS
(select object_name(object_id) as procname
from sys.sql_modules
where definition LIKE '%CTLEMPLOYEE%' collate SQL_Latin1_General_CP1_CI_AS
and ( object_name(object_id) NOT LIKE '%BACKUP%'
or object_name(object_id) not like '%backup%'
OR object_name(object_id) NOT LIKE '%Wi%' collate SQL_Latin1_General_CP1_CI_AS
))
SELECT * FROM CTE
Run Code Online (Sandbox Code Playgroud)
输出仍然包含如下名称:
report_spBIHRRecruitmentReport_Phase2_backup
以下是我的数据库信息:
版本:SQL Server 2012
Collation:SQL_Latin1_General_CP1_CI_AS
comptabilty level :90
问:
你能帮我理解为什么我仍然得到像 '%backup% 或 '%wi%' 这样的名字吗?
重现脚本:
create proc usp_test1_backup
as
begin
end
create proc usp_test2_wi
as
begin
end
drop proc usp_test1_backup
drop proc usp_test2_wi
Run Code Online (Sandbox Code Playgroud)
我的查询的执行计划是否对您有帮助:
如果您需要更多信息,请告诉我
答案很简单。您正在使用大量的ORs,应该是ANDs:
object_name(object_id) NOT LIKE '%BACKUP%'
or object_name(object_id) not like '%backup%'
OR object_name(object_id) NOT LIKE '%Wi%'
Run Code Online (Sandbox Code Playgroud)
在您的情况下,object_name(object_id) not like '%backup%' 仍将匹配OR object_name(object_id) NOT LIKE '%Wi%',因此将返回行等。
将上述所有条件更改为AND,您就可以了。
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |