如何比较100个数据库中的单个存储过程? T-SQL

时间:2018-05-13 16:42:40

标签: sql-server database tsql

我需要一种方法来比较多个(数百和数百个)数据库中的存储过程。不只是一次比较两个。看起来ApexSQL一次只做两个(除非我弄错了)。这不会起作用,因为它将需要永远。我需要按存储过程进行分组,以便我可以确定哪些组可以进行某些更改。

我尝试了以下代码解决方案:

select 
    'select OBJECT_NAME(object_id), OBJECT_DEFINITION(object_id) from ' + 
    name + '.sys.procedures where name like ''sp_someProcedure%'' union'  
from 
    master.sys.databases

然后我尝试将输出的脚本抛出到子选择中,我通过存储过程执行组操作。这不起作用,因为出于某种原因,你可以在多个数据库之间联合使用sys(除非我弄错了)。每个select语句都保留在您正在使用的上下文中。所以使用databaseOne保留在databaseOne中,即使以下select语句是从databaseTwo中选择blah blah blah。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先,让我们从一篇有用的文章开始讨论主题:Is the sp_ prefix still a no-no?。不要使用sp_启动SP的名称,它是Microsoft为系统存储过程保留的。文章进一步讨论了为什么这是一个坏主意;但简单地说,你的SP可能(突然)停止工作一天,而且它可能会有性能损失。

现在,更多关于主题。您可以使用无证件 sp sp_msforeachdb。这导致类似:

CREATE TABLE #Procs (ObjectName sysname, ObjectDefination nvarchar(MAX));

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT OBJECT_NAME(object_id), OBJECT_DEFINITION(object_id)' + NCHAR(10) +
           N'FROM [?].sys.procedures' + NCHAR(10) + 
           N'WHERE [name] LIKE ''sp_someProcedure%'';';

INSERT INTO #Procs
EXEC sp_msforeachdb @SQL;

SELECT *
FROM #Procs;

DROP TABLE #Procs;