我在我的查询中使用MERGE,并且我在INSENT上进行了INSEN NOT MATCHED THEN,但后来我想获得插入的行标识并对另一个表进行另一个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
但是我无法组装它,没有更多的源代码,如果语句显示错误:
“多部分标识符 source.photo无法绑定“
但它就在那里。为了清楚起见,ImportDataType是一个表值参数。
请帮助
答案 0 :(得分:13)
如果您在查询中不需要WHEN MATCHED
语句的MERGE
部分,则没有真正的理由使用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