Sql server 不匹配时sql server与多个插入合并

Sql server 不匹配时sql server与多个插入合并,sql-server,merge,insert,identity,Sql Server,Merge,Insert,Identity,我在查询中使用MERGE,然后在不匹配时插入on子句,但是我希望获得插入的行标识,并对其他表进行另一次插入。目前的查询是: 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 = so

我在查询中使用MERGE,然后在不匹配时插入on子句,但是我希望获得插入的行标识,并对其他表进行另一次插入。目前的查询是:

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无法再访问源代码,如果语句显示错误:

多部件标识符 无法绑定source.photo

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

如果查询中不需要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来更新,只是为了澄清样本,我的错。但是您的示例很有趣,我将尝试分析它并根据我的需要进行调整,这是一个很好的参考。我是一个很好的建议,thx,我已经设法让它工作。请注意,如果您也需要从源记录输出数据,合并仍然很有用。MERGE-OUTPUT语句可以返回插入的数据和源数据,而INSERT语句只能返回插入行中的值。