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?

提前致谢。

4

5 回答 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;
于 2012-06-16T14:08:19.633 回答
1

我也有另一种选择

DECLARE @SQL VARCHAR(8000)  

SELECT @SQL=''  

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

EXEC(@SQL)

但它足够好吗?

于 2012-06-22T09:48:22.047 回答
0

您不能在选择查询中执行。游标可以使您满足您的需求,但是,它似乎过于复杂。如果您正在开发一个应用程序,您可能希望将此逻辑放在架构中更高的位置。

问候

于 2012-06-16T13:56:16.523 回答
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
于 2012-06-16T14:11:16.153 回答
0

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

使用 sp_executesql 的基本语法:

sp_executesql [@SQLStatement],[@ParameterDefinitionList],[@ParameterValueList]   

@ParameterDefinition 用于在执行 SQL 字符串之前指定参数格式。你可以在 google 上找到很多这方面的例子。希望有帮助。

于 2012-06-16T14:20:44.347 回答