Object_name(object_id) 返回错误结果

The*_*war 2 sql-server t-sql

我们试图排除名称类似于“%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

然后我尝试使用 collat​​e 来限制结果之类的结果..

;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
Collat​​ion: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)

我的查询的执行计划是否对您有帮助:

http://pastebin.com/aKBqkPzj

如果您需要更多信息,请告诉我

Phi*_*lᵀᴹ 5

答案很简单。您正在使用大量的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,您就可以了。

  • 现在是星期一早上。容易想太多:-) (3认同)