执行一组存储过程



我正在尝试创建一个存储过程来执行模式中的所有存储过程。这是我的文件:

ALTER procedure [ALL_IC].[EXECUTE_ICS]
    @sql nvarchar(max) = null, 
    @fa nvarchar(max) = null
as 
begin
    set @sql = ('select (select ''EXEC [IC].['' + b.name + ''];''
                         from sys.procedures b  
                         join sys.schemas s on s.schema_id = b.schema_id
                         where s.name = ''IC''
                         for xml path(''''))'
                        ) end 
    EXECUTE sp_executesql @sql

运行this选择字符串来执行所有存储过程,但并不实际执行它们。

EXEC ALL_IC.EXECUTE_ICS

我如何通过运行这行代码来执行所有的存储过程?

SQL Server 2012

除了这让人想到的许多可怕的东西之外,实际的逻辑是相当简单的。你只需要创建一个动态字符串并执行它。

有一个非常简单的方法可以做到这一点。

declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'EXEC ' + quotename(s.name) + '.' + quotename(b.name) + ';'
from sys.procedures b
join sys.schemas s on s.schema_id = b.schema_id
where s.name = 'IC'
select @SQL
--exec sp_executesql @SQL

——编辑——

稍作修改,使模式不在动态sql中硬编码。这样,如果你想要一个不同的模式,你只需要改变模式名,其他的一切都可以正常工作。

——第二个编辑

更改为使用QuoteName而不是硬编码在[]。

只是为了确保您没有执行任何需要参数的过程,我针对系统目录sys.parameters添加了一个小检查。剩下的和你在你的问题中想要做的差不多。

Declare @sql NVARCHAR(MAX);

SELECT @sql = STUFF((SELECT '  Exec ' + QUOTENAME(s.name) +'.'+ QUOTENAME(p.name) + ';  '
                FROM sys.procedures P 
                INNER JOIN sys.schemas S ON P.schema_id = S.schema_id
                WHERE s.name = 'IC' 
                 AND NOT EXISTS (SELECT 1 
                                  FROM sys.parameters pm
                                  WHERE p.object_id = pm.object_id)
                 FOR XML PATH('')),1,2,'');
Exec sp_executesql @sql

最新更新