将查询结果传递给存储过程

时间:2012-09-28 15:51:20

标签: sql-server stored-procedures

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

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

例如,我有tableA

SELECT * FROM TABLEA 

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

现在,有没有办法可以致电

EXEC sp_name (SELECT * FROM TABLEA) 

这样存储过程会为每一行执行吗?

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

3 个答案:

答案 0 :(得分:1)

实现此目的的最佳方法是将第二个存储过程创建为用户定义的函数。然后你可以用这种方式调用它:

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

或者,可能有一种方法可以将两个存储过程合并到一个集合中,但我必须看到你正在调用的第二个存储过程。

答案 1 :(得分:1)

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

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

  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; 
    
  4. 这应该为你做的工作, 如需进一步参考,请参阅下面的链接# http://msdn.microsoft.com/en-us/library/bb510489%28v=sql.105%29.aspx

答案 2 :(得分:0)

从技术上讲,是的,但你对sproc的调用格式很糟糕。

Exec sp_name 'SELECT * FROM TABLEA' 

Exec sp_name @sql1 = 'SELECT * FROM TABLEA' 

那就是说,你要做的事可能不是一个好主意。