2011-05-13 44 views
3

我期待着做这样的事情,但它不会编译。我存储的proc返回一个表。这里就是我想要做的事情 - 也许有人能指出我在做什么错了,因为这并不编译:SQL合并声明使用存储过程作为源

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); 

回答

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 ... 
3

你只能到INSERT ... EXEC。解决方法是将其缓存到#temp表或@table变量中,并将其用于MERGE。

+0

认为是这样的......只需要在@table中定义很多列...噢.. – Denis 2011-05-13 19:35:37

0

有时候我创建函数或视图返回的东西会存储过程,然后编写存储过程只是调用视图/功能。这样我就可以封装逻辑,能够在连接中使用查询,并利用sproc功能。

+0

只要sproc不使用副作用,如动态SQL。 – mellamokb 2011-05-13 19:19:10

+0

我不知道这是否正确。在SQL Server中,sproc没有一组具体的字段返回。我不相信你可以在VIEWS或UDF中使用sprocs。也许海报正在谈论其他一些数据库? – Denis 2011-05-16 15:12:11