2010-10-06 12 views
9

मैं अपनी क्वेरी में मेरिज का उपयोग कर रहा हूं और मैं उस खंड पर 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 एक तालिका-मूल्यवान पैरामीटर है।

मदद कृपया

उत्तर

13

आप अपने प्रश्न में MERGE बयान के WHEN MATCHED भाग की जरूरत नहीं है, वहाँ MERGE उपयोग करने के लिए कोई वास्तविक कारण नहीं है। आप बाहरी जोड़ या NOT EXISTS कथन के साथ INSERT का उपयोग कर सकते हैं।

किसी भी मामले में, आप 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

जब अद्यतन करने के लिए भी मिलान, बस नमूना स्पष्ट करने के लिए यह छीन मैं उपयोग कर रहा हूँ, मेरा बुरा:

मैं अपने उदाहरण का विस्तार किया है। लेकिन आपका नमूना दिलचस्प है, मैं इसका विश्लेषण करने और अपनी जरूरतों को समायोजित करने की कोशिश करूंगा, यह एक अच्छा संदर्भ है। – Programista

+0

मैं वास्तव में एक अच्छी सलाह थी, thx, मैं इसे काम करने में कामयाब रहा है। – Programista

+1

ध्यान दें कि यदि आप स्रोत रिकॉर्ड से डेटा आउटपुट करने की आवश्यकता है तो 'MERGE' अभी भी उपयोगी है। 'मेर्ज' 'आउटपुट 'कथन सम्मिलित डेटा और स्रोत डेटा दोनों को वापस कर सकता है, जबकि' INSERT' कथन केवल सम्मिलित पंक्ति से मान वापस कर सकता है। –

संबंधित मुद्दे