2010-10-06 71 views
9

我在我的查詢中使用合併,我做條款時INSERT不當然,然後我想獲得插入的行身份,並作出另一個插入一些其他表。現在查詢是:SQL服務器與多個插入時合併,當不匹配

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 

但我不能組裝起來,一有源沒有接入沒有更多的,還if語句顯示錯誤:

「多部分標識符 source.photo無法綁定「

但它在那裏。爲了清楚起見,ImportDataType是一個表值參數。

請幫助

回答

13

如果您不需要在您的查詢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 
+0

我使用WHEN也符合更新,只是剝離它澄清樣品,是我不好。但你的樣本很有意思,我會盡量分析它並根據我的需要進行調整,這是一個很好的參考。 – Programista 2010-10-06 12:52:46

+0

我真的是一個很好的建議,thx,我設法讓它工作。 – Programista 2010-10-06 18:05:24

+1

請注意,如果您需要從源記錄輸出數據,MERGE仍然有用。 'MERGE'' OUTPUT'語句可以返回插入的數據和源數據,而'INSERT'語句只能從插入的行返回值。 – 2013-10-06 17:21:55