我正在尝试创建一个存储过程来执行模式中的所有存储过程。这是我的文件:
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