使用存储过程作为源的SQL Merge语句

时间:2011-05-13 19:13:41

标签: sql-server tsql sql-server-2008 stored-procedures merge

我希望做这样的事情,但它不会编译。我的存储过程返回一个表。这就是我想要做的事情 - 也许有人可以指出我做错了,因为这不会编译:

MERGE table AS target
   USING (EXEC [dbo].[sp_Something] @Rundate = '5/13/2011', @SPID = 56) 
      AS source (<Columns Returned By Stored Proc Go Here>)
ON TARGET.ID = SOURCE.ID 
WHEN MATCHED THEN
    UPDATE SET Field = Value...
WHEN NOT MATCHED THEN
    INSERT ( Field )
         VALUES (Value);

3 个答案:

答案 0 :(得分:5)

在需要表的地方不能使用存储过程。您必须使用表变量,子查询或表值函数。例如(不确定这是否有效,我以前从未使用过MERGE):

DECLARE @Something TABLE (columns go here...)

INSERT @Something
EXEC [dbo].[sp_Something] @Rundate = '5/13/2011', $SPID = 56

MERGE table as target
    USING @Something
       AS Source ...

答案 1 :(得分:3)

您只能INSERT ... EXEC。解决方法是将#mpmp表或@table变量换行,并将其用于MERGE。

答案 2 :(得分:0)

有时我创建函数或视图来返回sproc会发生的内容,然后编写sproc来调用视图/函数。这样我就封装了逻辑,能够在连接中使用查询,并利用sproc功能。