2010-10-06 14 views
9

Używam MERGE w moim zapytaniu i robię INSERT na klauzuli GDZIE NIE DOPASOWANY TO, ale wtedy chciałbym uzyskać wstawioną tożsamość rzędu i zrobić INSERT do niektórych inna tabela. Zapytanie teraz jest:Połączenie serwera sql z wieloma wstawkami, gdy nie pasują

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); 

Więc jak widać Muszę wstawić niektóre wartości do tabeli docelowej na podstawie danych źródłowych, a potem muszę wziąć tożsamość wkładkę i włóż ją do innego stolika, ale także na podstawie niektórych dane źródłowe, więc coś w tym stylu, po pierwszym wkładem:

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

ale nie mogę zmontować niego, nie ma dostępu do źródła nie więcej, również if pokazać błąd:

"Wieloczęściowy identyfikator source.photo nie można powiązać "

ale jest tam. Tylko dla przejrzystości ImportDataType jest parametrem o wartości tabelarycznej.

Proszę o pomoc

Odpowiedz

13

Jeśli nie potrzebujemy WHEN MATCHED część rachunku MERGE w zapytaniu, nie ma prawdziwy powód do korzystania MERGE. Można użyć INSERT z instrukcją zewnętrznego sprzężenia lub NOT EXISTS.

W obu przypadkach można użyć klauzuli OUTPUT, aby pobrać wstawioną wartość tożsamości i przekazać ją drugiemu zapytaniu.

ja przedłużyliśmy Twój przykład:

<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

używam kiedy dopasowane również do aktualizacji, po prostu pozbawione go do wyjaśnienia próbki, mój zły. Ale twoja próbka jest interesująca, spróbuję ją przeanalizować i dostosować do moich potrzeb, jest to dobre odniesienie. – Programista

+0

Byłem naprawdę dobrą radą, udało mi się ją wykonać. – Programista

+1

Zauważ, że "MERGE" jest nadal użyteczny, jeśli potrzebujesz danych wyjściowych z rekordu źródłowego. Instrukcja "MERGE" "WYJŚCIE" może zwracać zarówno wstawione dane, jak i dane źródłowe, podczas gdy instrukcja 'INSERT' może zwracać wartości tylko z wstawionego wiersza. –

Powiązane problemy