我想创建一个包含两个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指令。
我错过了什么吗?
如果SELECT语句不是INSERT语句的直接行源,则不允许嵌套INSERT、UPDATE、DELETE或MERGE语句。
来源:链接