3

我有一个接受三个参数的存储过程。

是否可以使用查询作为输入来调用此存储过程?

例如,我有tableA.

SELECT * FROM TABLEA 

| A | B | C |
|---+---+---|
| 1 | 2 | 3 |
| 4 | 5 | 6 |

现在,有没有办法可以打电话

EXEC sp_name (SELECT * FROM TABLEA) 

以便为每一行执行存储过程?

我背后的原因是我有一个需要为多行调用的存储过程。我可以编写一个脚本来执行此操作,但想知道是否可以使用 TSQL 执行此操作。

4

3 回答 3

1

此解决方案假设 T-SQL 在 SQL SERVER 2008 及更高版本上运行

  1. 创建一个表类型变量,这只需要做一次 USE YOURDBNAME; Go Create TYPE TableAType as Table (A int null,B int null, C int null); 这将在您当前使用的数据库中的用户定义的表类型中创建一个表类型变量。

  2. 在您的存储过程中,声明此表类型的变量。并使用表 A 中的内容填充它。示例:

    Create Procedure MyStoredProcedure1 AS Declare @TableB as TableAType; 
    Insert into @TableB(A,B,C) Select A,B,C from TableA;
    
  3. 创建您的主存储过程

    Create Procedure MyStoredProcedure2
    @TVP TableAType READONLY
    as 
    EXEC sp_Name @TVP; 
    

这应该为您完成工作,如需进一步参考,请参阅下面的链接# http://msdn.microsoft.com/en-us/library/bb510489%28v=sql.105%29.aspx

于 2013-07-16T11:24:14.923 回答
1

完成此操作的最佳方法是将您的第二个存储过程创建为用户定义的函数。然后你可以这样调用它:

SELECT * 
FROM TableA
CROSS APPLY dbo.yourUserFunction(column1, column2, etc)

或者,可能有一种方法可以将两个存储过程组合成一个集合,但我必须看看你调用的第二个存储过程是什么。

于 2012-09-28T16:15:52.420 回答
0

从技术上讲,是的,但是您对 sproc 的调用格式错误。

Exec sp_name 'SELECT * FROM TABLEA' 

或者

Exec sp_name @sql1 = 'SELECT * FROM TABLEA' 

也就是说,您尝试做的事情可能不是一个好主意。

于 2012-09-28T16:03:25.803 回答