我需要一种方法来比较多个(数百和数百个)数据库中的存储过程。不只是一次比较两个。看起来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。
有什么想法吗?
答案 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;