2016-03-11 32 views
0

當我執行下面的代碼時,我仍然在ObjName列中查看以'x'值開頭的值。我不明白爲什麼。我也嘗試使用下面的LIKE子句很好,但無濟於事:NOT LIKE子句在執行sp_MSforeachdb函數時不起作用

和o.name NOT LIKE「」 x%的'

如何糾正我的問題任何幫助/方向是不勝感激。謝謝你的時間。請參閱下面的圖片以及我的結果集。

NotLikeClauseIssue

這裏是我的代碼:

SET NOCOUNT ON; 
DECLARE @text NVARCHAR(128) 
DECLARE @text1 NVARCHAR(128) 
DECLARE @text2 NVARCHAR(5) 
DECLARE @sql NVARCHAR(MAX) 
SET @text = 'DBSQLSERVER.' -- ENTER THE SQL SERVER BEING SEARCHED FOR. 
SET @text1 = 'DBSQLSERVER].' -- ENTER THE SQL SERVER BEING SEARCHED FOR. 
SET @text2 = 'x'             --                                   | 
SET @sql =                   --                                   | 
                                --                                   V   
       'USE [?]                  
       SELECT ''?'' [DBName], @@SERVERNAME AS [WorkingServer], ''DBSQLSERVER'' AS [ServerToSearch], o.name AS [ObjName], o.type_desc [TypeDesc] 
       FROM sys.sql_modules m 
       INNER JOIN sys.objects o 
       ON m.object_id = o.object_id 
       WHERE m.definition LIKE ' + CHAR(39) + '%' + @text + '%' + CHAR(39) + ' 
       OR m.definition LIKE ' + CHAR(39) + '%' + @text1 + '%' + CHAR(39) + ' 
       AND o.name NOT LIKE '+ CHAR(39) + @text2 + '%' + CHAR(39) + ' 
       ORDER BY o.name asc'     
EXEC sp_MSforeachdb @sql; 
+3

'或'和'和'有混亂的優先級。總是在整個子句中添加括號:'WHERE((p)OR(q))AND(s)',否則你會得到這樣的令人討厭的驚喜。 –

+0

非常感謝Jeroen。我很欣賞快速反應。就是這樣。 – Melinda

回答

1
SELECT ''?'' [DBName], @@SERVERNAME AS [WorkingServer], ''DBSQLSERVER'' AS [ServerToSearch], o.name AS [ObjName], o.type_desc [TypeDesc] 
FROM sys.sql_modules m 
INNER JOIN sys.objects o 
     ON m.object_id = o.object_id 
WHERE o.name NOT LIKE ' + CHAR(39) + @text2 + '%' + CHAR(39) + ' 
    AND ( m.definition LIKE ' + CHAR(39) + '%' + @text + '%' + CHAR(39) + ' 
     OR m.definition LIKE ' + CHAR(39) + '%' + @text1 + '%' + CHAR(39) + ' 
    ) 
ORDER BY o.name asc'