【问题标题】:sql server merge with multiple insert when not matchedsql server 在不匹配时与多个插入合并
【发布时间】:2011-04-21 18:18:14
【问题描述】:

我在我的查询中使用了 MERGE,并且我正在对子句 WHEN NOT MATCHED THEN 进行 INSERT,但是我想获取插入的行标识并对其他表进行另一个 INSERT。现在的查询是:

ALTER PROCEDURE [dbo].[BulkMergeOffers]
@data ImportDataType READONLY
AS
SET NOCOUNT ON;
DECLARE @cid int = 0
MERGE dbo.oferta AS target
USING @data AS source 
ON    (target.nr_oferty = source.nr_oferty)
WHEN NOT MATCHED THEN 
INSERT (nr_oferty,rynek,typ_transakcji, typ_nieruchomosci,cena,powierzchnia, rok_budowy, wojewodztwo, miasto, dzielnica, ulica, opis, wspolrzedne, film, zrodlo, KontaktStore, data, forma_wlasnosci, stan_techniczny, liczba_pokoi, liczba_peter, pietro, material, kuchnia, pow_dzialki, typ_dzialki, woda,gaz, prad,sila, przeznaczenie,lokal_dane)
      VALUES (source.nr_oferty,source.rynek,source.typ_transakcji,  source.typ_nieruchomosci,source.cena,source.powierzchnia, source.rok_budowy, source.wojewodztwo, miasto,    source.dzielnica, source.ulica, source.opis, source.wspolrzedne, source.film, source.zrodlo, source.KontaktStore, source.data, source.forma_wlasnosci, source.stan_techniczny, source.liczba_pokoi,     source.liczba_peter, source.pietro, source.material, source.kuchnia, source.pow_dzialki, source.typ_dzialki, source.woda,source.gaz, source.prad,source.sila, source.przeznaczenie,source.lokal_dane); 

所以如您所见,我需要根据源数据向目标表插入一些值,然后我需要获取插入标识并将其插入到另一个表中,但也要基于一些源数据,所以类似这样,只是在第一次插入之后:

SET @cid = SCOPE_IDENTITY();
if source.photo is not null
begin
insert into dbo.photos(offerID, file) values (@cid, source.photo);
end

但我无法组装它,a 无法访问源代码,if 语句也显示错误:

" 多部分标识符 source.photo 无法绑定”

但它就在那里。为清楚起见,ImportDataType 是一个表值参数。

请帮忙

【问题讨论】:

    标签: sql-server merge insert identity


    【解决方案1】:

    如果您的查询中不需要MERGE 语句的WHEN MATCHED 部分,则没有真正的理由使用MERGE。您可以将INSERT 与外连接或NOT EXISTS 语句一起使用。

    在任何一种情况下,您都可以使用OUTPUT 子句检索插入的标识值并将其传递给第二个查询。

    我扩展了你的例子:

    <stored procedure header - unchanged>
    
    --declare a table variable to hold the inserted values data
    DECLARE @newData TABLE
    (nr_oferty int
    ,newid int
    ) -- I'm guessing the datatype for both columns
    
    MERGE dbo.oferta AS target
    USING @data AS source 
    ON    (target.nr_oferty = source.nr_oferty)
    WHEN NOT MATCHED THEN 
    INSERT (nr_oferty,rynek,typ_transakcji, typ_nieruchomosci,cena,powierzchnia, rok_budowy, wojewodztwo, miasto, dzielnica, ulica, opis, wspolrzedne, film, zrodlo, KontaktStore, data, forma_wlasnosci, stan_techniczny, liczba_pokoi, liczba_peter, pietro, material, kuchnia, pow_dzialki, typ_dzialki, woda,gaz, prad,sila, przeznaczenie,lokal_dane)
          VALUES (source.nr_oferty,source.rynek,source.typ_transakcji,  source.typ_nieruchomosci,source.cena,source.powierzchnia, source.rok_budowy, source.wojewodztwo, miasto,    source.dzielnica, source.ulica, source.opis, source.wspolrzedne, source.film, source.zrodlo, source.KontaktStore, source.data, source.forma_wlasnosci, source.stan_techniczny, source.liczba_pokoi,     source.liczba_peter, source.pietro, source.material, source.kuchnia, source.pow_dzialki, source.typ_dzialki, source.woda,source.gaz, source.prad,source.sila, source.przeznaczenie,source.lokal_dane)
    OUTPUT inserted.nr_oferty, inserted.<tableId> INTO @newData; 
    -- replace <tableId> with the name of the identity column in dbo.oftera
    
    insert into dbo.photos(offerID, file)
    SELECT nd.newid, pt.photo
    FROM   @data AS pt
    JOIN   @newData AS nd
    ON     nd.nr_oferty = pt.nr_oferty
    WHERE  pt.photo IS NOT NULL
    

    【讨论】:

    • 我也在使用 WHEN MATCHED 进行更新,只是为了澄清样本而将其剥离,我的错。但是你的样本很有趣,我会尝试分析它并根据我的需要进行调整,这是一个很好的参考。
    • 我确实是一个很好的建议,谢谢,我已经成功了。
    • 请注意,如果您还需要从源记录中输出数据,MERGE 仍然很有用。 MERGE OUTPUT 语句可以返回插入数据和源数据,而INSERT 语句只能返回插入行的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多