我正在尝试创建一个存储过程来执行模式中的所有存储过程。这就是我所拥有的:
EXEC ALL_IC.EXECUTE_ICS
运行它会选择字符串来执行所有存储过程,但它实际上并没有执行它们。
org.andengine.exception
如何通过运行该代码行来实际执行所有存储过程?
SQL Server 2012
答案 0 :(得分:1)
除了令人想到的众多可怕的事情,实际的逻辑非常简单。您只需要构建一个动态字符串并执行它。
这是一种非常简单的方法。
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而不是[]中的硬编码。这更加灵活和稳定。
答案 1 :(得分:0)
为了确保您没有执行任何期望参数的过程,我在系统目录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