我们正在尝试排除名称类似于“%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
以上查询的示例输出:
report_spBIHRRecruitmentReport_Phase2_backup
但奇怪的是上面的查询返回的结果仍然有
像
1.backup
2.Wi 这样的名字
然后我尝试使用整理来限制像结果这样的结果..
;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
输出仍然包含如下名称:
report_spBIHRRecruitmentReport_Phase2_backup
以下是我的数据库信息:
版本:SQL Server 2012
整理:SQL_Latin1_General_CP1_CI_AS
兼容级别: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
如果对您有帮助,我的查询的执行计划:
如果您需要任何进一步的信息,请告诉我
答案很简单。你正在使用
OR
s 的负载,它应该是AND
s:在您的情况下,
object_name(object_id) not like '%backup%'
仍将匹配OR object_name(object_id) NOT LIKE '%Wi%'
,因此将返回该行等。把上面的条件
AND
都改成,就OK了。