按顺序执行 SQL Server 存储过程

5
我是一名有用的助手,可以为您翻译文本。

我有一些关于在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,还有其他解决方案吗?

提前感谢。


你希望通过这个做什么? - Chris Gessler
@Chris,我想从查询结果中执行存储过程列表。 - Willy Lazuardi
5个回答

5

使用字符串聚合构建一个单独的批处理,然后运行该批处理来调用所有过程。有许多字符串聚合拼接方法,但其中一种最有效的方法是XML黑盒子方法

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

我还有另一种选择

DECLARE @SQL VARCHAR(8000)  

SELECT @SQL=''  

SELECT @SQL = @SQL+ 'Exec ' + b.SPname
FROM TbFoo
WHERE SpId IN (1,2,3)

EXEC(@SQL)

但这够好吗?


0

你不能在一个select查询中执行代码。使用游标可以满足你的需求,但这似乎过于复杂。如果你正在开发一个应用程序,你可能希望将这个逻辑放在架构的更高层。

祝好


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

0
首先,这不是一个好的方法。但是如果你坚持要这样做,你可以在存储过程中使用动态sql。将所有存储过程名称的列表转储到一个临时表中,并在该表上使用循环将每个sp名称传递到动态sql查询中。可以使用EXECUTE命令或sp_executesql语句执行动态构建的T-SQL语句。我建议您选择后者,即sp_executesql。
使用sp_executesql的基本语法:
sp_executesql [@SQLStatement],[@ParameterDefinitionList],[@ParameterValueList]   

@ParameterDefinition 用于在执行 SQL 字符串之前指定参数格式。您可以在 Google 上找到许多示例。希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接