【问题标题】:SQL Server 2008 MERGE Instruction in another MERGE另一个 MERGE 中的 SQL Server 2008 MERGE 指令
【发布时间】:2014-07-09 08:42:18
【问题描述】:

我想用两条 MERGE 指令创建一个存储过程。

之前的过程太慢了(标准UPSERT):

IF EXISTS (SELECT 1 FROM F_Fond with (updlock,serializable) WHERE F_ISIN = @ISIN)
    BEGIN 
    (...)
    END
(...)

所以我尝试这样修改它:

CREATE PROCEDURE [dbo].[InsertPrixNew]
    (@Table InsertPrixFond READONLY)
AS
    MERGE INTO F_Fond T
    USING @Table S ON T.F_ISIN = S.ISIN

    WHEN MATCHED THEN
        BEGIN -- Here is the syntax problem...
            MERGE INTO F_PRIX P
            USING @Table S ON P.F_ISIN = S.ISIN
                           AND P.P_DATE = S.DATE

            WHEN MATCHED THEN
                UPDATE F_PRIX 
                SET P_PRIX = S.PRIX 
                WHERE F_ISIN = S.ISIN AND P_DATE = S.DATE

            WHEN NOT MATCHED THEN
                INSERT INTO F_PRIX (F_ISIN, P_DATE, P_PRIX) 
                VALUES (S.ISIN, S.DATE, S.PRIX);             
        END

    WHEN NOT MATCHED THEN
      BEGIN
          INSERT INTO F_FOND (F_ISIN, F_DATE_PRIX, F_Prix_Jour) 
          VALUES (S.ISIN, S.DATE, S.PRIX)

          INSERT INTO F_PRIX (F_ISIN, P_DATE, P_PRIX) 
          VALUES (S.ISIN, S.DATE, S.PRIX)     
      END;
-- Let's update F_DATE_PRIX
 UPDATE F_FOND SET F_DATE_PRIX = @Table.DATE, F_Prix_Jour = @Table.PRIX 
  INNER JOIN @Table ON @Table.ISIN = F_Fond.F_ISIN 
  WHERE @Table.DATE >= F_DATE_PRIX 
     OR F_DATE_PRIX IS NULL
RETURN

似乎我们不能在另一个 MERGE 中包含 MERGE 指令。

我错过了什么吗?

【问题讨论】:

    标签: sql sql-server merge


    【解决方案1】:

    在不是 INSERT 语句的直接行源的 SELECT 语句中不允许嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句。

    来源:link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多