我有一些关于在SQL Server中执行存储过程的案例。
也许这是不寻常的做法,但我已经在表格中存储了一个存储过程名称列表。该表与此类似(让我们称之为TableFoo
):
| SPId | SPName |
-------------------
| 1 | spr_name1|
| 2 | spr_name2|
| 3 | spr_name3|
| 4 | spr_name4|
...
我想调用/执行从TableFoo
的查询结果生成的存储过程列表,查询大致如下:
SELECT SPName
FROM TableFoo
WHERE SPId IN (1, 2, 3)
我想按行顺序执行存储过程
我的意思是我想这样做:)
SELECT EXEC(SpName)
FROM TableFoo
WHERE SPId IN (1, 2, 3)
但这不起作用
使用CURSOR
旁边的任何解决方案?
提前致谢。
答案 0 :(得分:5)
使用字符串聚合构建一个调用所有过程的批处理,然后运行此批处理。有许多字符串聚合连接方法,但其中最有效的是XML blackbox method:
create table #test (spid int, sproc sysname);
insert into #test (spid, sproc) values (1, N'sproc1')
, (2, N'sproc2')
, (3, N'sproc3')
, (4, N'sproc4')
, (5, N'sproc5')
, (6, N'sproc6');
declare @sql nvarchar(max);
set @sql = (select N'exec ' + sproc +N';
' from #test
where spid in (1,3,5) for XML path(''), type).value(N'.', 'nvarchar(max)');
exec sp_executesql @sql;
答案 1 :(得分:0)
您无法在选择查询中执行。光标可以使您满足您的需求,但是,它确实看起来过于复杂。如果您正在开发一个应用程序,您可能希望将此逻辑放在架构中更高的位置。
此致
答案 2 :(得分:0)
Declare @SPCall table
(id int,SP varchar(20))
Insert into @SPCall
values
(1,'sp1'),(2,'sp3'),(3,'sp3')
Declare @spName varchar(20)
Declare @value int
set @value =1
While @value<=(Select COUNT(*) from @SPCall)
BEGIN
Set @spName=(select Sp from @SPCall where id=@value)
exec @spName
set @value=@value +1
END
答案 3 :(得分:0)
首先,这不是一个好方法。但是如果你坚持这样做,你可以在存储过程中使用动态sql。将所有SP名称的列表转储到临时表中,并使用该表上的循环将每个sp名称传递给dynsmic sql查询。可以使用EXECUTE Command或sp_executesql语句执行动态构建的T-SQL语句。我建议你选择后者,即sp_executesql。
使用sp_executesql的基本语法:
sp_executesql [@SQLStatement],[@ParameterDefinitionList],[@ParameterValueList]
@ParameterDefinition用于在执行SQL字符串之前指定参数格式。你可以在谷歌上获得很多这方面的例子。希望有所帮助。
答案 4 :(得分:0)
我还有另一种选择
DECLARE @SQL VARCHAR(8000)
SELECT @SQL=''
SELECT @SQL = @SQL+ 'Exec ' + b.SPname
FROM TbFoo
WHERE SpId IN (1,2,3)
EXEC(@SQL)
但这还不错吗?