【问题标题】:SQL Merge Statement using stored proc as source使用存储过程作为源的 SQL 合并语句
【发布时间】:2011-08-25 04:43:14
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    不能在需要表的地方使用存储过程。您必须使用表变量、子查询或表值函数。例如(不确定这是否有效,我之前从未使用过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 ...
    

    【讨论】:

      【解决方案2】:

      您只能到INSERT ... EXEC。解决方法是假脱机到 #temp 表或 @table 变量,并将其用于 MERGE。

      【讨论】:

      • 是这样想的...只是需要在@table 中定义很多列...哦,好吧..
      【解决方案3】:

      有时我会创建返回存储过程的函数或视图,然后编写存储过程来调用视图/函数。这样我封装了逻辑,能够在连接中使用查询,并利用 sproc 特性。

      【讨论】:

      • 只要存储过程不使用副作用,例如动态 SQL。
      • 我不知道这是否正确。在 SQL Server 中,sproc 没有它返回的具体字段集。我不相信您可以在 VIEWS 或 UDF 中使用存储过程。也许张贴者在谈论其他数据库?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多