2008-09-18 8 views
45

मैं किसी तालिका तालिका में एक तालिका ए में एकाधिक रिकॉर्ड डाल रहा हूं। क्या तालिका का पहचान मान प्राप्त करने का कोई तरीका है एक कर्सर करने के साथ रिकॉर्ड रिकॉर्ड और अद्यतन तालिका बी रिकॉर्ड?एकाधिक रिकॉर्ड कैसे सम्मिलित करें और पहचान मान कैसे प्राप्त करें?

Create Table A 
(id int identity, 
Fname nvarchar(50), 
Lname nvarchar(50)) 

Create Table B 
(Fname nvarchar(50), 
Lname nvarchar(50), 
NewId int) 

Insert into A(fname, lname) 
SELECT fname, lname 
FROM B 

मैं एमएस एसक्यूएल सर्वर का उपयोग कर रहा 2005

+0

मुझे एहसास है कि यह एक पुराना प्रश्न है और यह SQL सर्वर 2005 निर्दिष्ट करता है लेकिन चूंकि यह 2008 में उपलब्ध मेरिज स्टेटमेंट को दिखाने का पहला परिणाम है और बाद में समाधान की तलाश करने वालों के लिए इसका उल्लेख किया जाना चाहिए। TargetTable में विलय का उपयोग ( का चयन करें .... ) स्रोत के रूप में पर 1 = 2 जब तत्कालीन मिलान नहीं सम्मिलित करें .... आउटपुट inserted.ID जांच TempTable ( InsertedID ) – oldegreyg

+0

आपको एक साधारण डालने के लिए विलय की आवश्यकता नहीं है। मर्ज एक डालने/अपडेट के लिए अच्छा है, लेकिन एक साधारण डालने के लिए ओवरकिल। एंडी के आउटपुट जवाब ने मेरे लिए काम किया और इंडेक्स लॉक को दूर करने में मदद की। – CodeMonkeyForHire

+0

एंडी इरविंग का जवाब सबसे अच्छा है। ट्रिगर्स बेकार हैं और अपनी लक्षित तालिका पर मनमाने ढंग से संचालन के लिए अच्छी तरह से काम नहीं करते हैं, खासकर यदि आपका लक्ष्य अस्थायी है या सिर्फ मध्यवर्ती है। डैरेन का जवाब गलत है, यदि आप पंक्तियों का एक सेट डाल रहे हैं, तो लक्ष्य तालिका में उनका क्रम आवश्यक रूप से आपके सेट के क्रम के समान नहीं है। दिमित्री का रास्ता खराब है क्योंकि इसे धीमी प्रदर्शन के अनुसार एक पंक्ति में डालने के लिए एक लूप की आवश्यकता होती है, जब आप कर सकते हैं तो हमेशा सेट का उपयोग करें। कॉरी का रास्ता खराब है और उसने समझाया, "जब तक वे संघर्ष नहीं करते हैं।" यह शनिवार की रात सी – clemahieu

उत्तर

-6

MBelly पैसे पर सही है - लेकिन फिर ट्रिगर हमेशा की कोशिश करेंगे और अद्यतन तालिका बी है कि भले ही आवश्यक नहीं है (क्योंकि आप भी तालिका सी से डालने रहे हैं ?)।

डैरेन भी यहां सही है, आप परिणाम सेट के रूप में कई पहचान वापस नहीं प्राप्त कर सकते हैं। आपके विकल्प कर्सर का उपयोग कर रहे हैं और आपके द्वारा डाली गई प्रत्येक पंक्ति के लिए पहचान ले रहे हैं, या पहले और बाद में पहचान को संग्रहीत करने के डैरेन के दृष्टिकोण का उपयोग कर रहे हैं। जब तक आप पहचान की वृद्धि को जानते हैं, तब तक यह काम करना चाहिए, जब तक आप सुनिश्चित करते हैं कि तालिका तीनों घटनाओं के लिए बंद है।

यदि यह मैं था, और यह समय महत्वपूर्ण नहीं था तो मैं कर्सर के साथ जाऊंगा।

0

आप हमेशा इस व्यवहार चाहते हैं, आप एक सम्मिलित ट्रिगर के बाद TableA कि तालिका बी

0

अद्यतन करेगा पर डाल सकता है आप प्राप्त कर सकते हैं row number पर शामिल होने से। यह संभव है क्योंकि चूंकि यह एक पहचान है, इसलिए जब आप आइटम जोड़ते हैं तो यह बढ़ेगा, जो कि आप उन्हें चुन रहे हैं।

+2

गलत में बदलने जा रहा है, रिकॉर्ड्स को उस क्रम में डेटाबेस में जाने की गारंटी नहीं है, जिसमें आपको लगता है कि वे अंदर जा रहे हैं। – HLGEM

0

जहां तक ​​मैं समझता हूं कि आपके पास यह मुद्दा है कि आप तालिका ए में प्रवेश करना चाहते हैं, जिसमें पहचान कॉलम है, और आप तालिका बी से पहचान को संरक्षित करना चाहते हैं जो नहीं है।

ऐसा करने के लिए आपको केवल तालिका ए पर पहचान सम्मिलन चालू करना होगा। इससे आपको अपनी आईडी को सम्मिलित करने की अनुमति मिल जाएगी और जब तक वे संघर्ष नहीं करेंगे, आपको ठीक होना चाहिए। तो फिर तुम सिर्फ कर सकते हैं:

Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B 
नहीं

यकीन है कि क्या डीबी प्रयोग कर रहे हैं, लेकिन एसक्यूएल सर्वर के लिए आदेश पहचान डालने को चालू करने के होगा:

set identity_insert A on 
+0

वह टेबल ए अपडेट करने की कोशिश नहीं कर रहा है, वह तालिका अपडेट करने का प्रयास कर रहा है बी टेबल बी में पहचान कॉलम नहीं है। – njr101

4

ध्यान से अपने प्रश्न पढ़ना, तुम सिर्फ करना चाहते हैं तालिका ए

बाद डालने समाप्त हो गया है में नई पहचान मूल्यों पर आधारित अद्यतन तालिका बी, बस एक अद्यतन चलाने ...

UPDATE B 
SET NewID = A.ID 
FROM B INNER JOIN A 
    ON (B.FName = A.Fname AND B.LName = A.LName) 

यह मानता है कि तालिका के बीच रिकॉर्ड से मेल खाने के लिए FName/LName संयोजन का उपयोग किया जा सकता है। यदि ऐसा नहीं है, तो रिकॉर्ड सुनिश्चित करने के लिए आपको अतिरिक्त फ़ील्ड जोड़ने की आवश्यकता हो सकती है।

यदि आपके पास कोई वैकल्पिक कुंजी नहीं है जो आपको रिकॉर्ड से मेल खाने की अनुमति देती है तो यह बिल्कुल समझ में नहीं आता है, क्योंकि तालिका बी में रिकॉर्ड एक-दूसरे से अलग नहीं किए जा सकते हैं।

0

मैं पहचान के बजाय अद्वितीय पहचानकर्ता प्रकार का उपयोग करने का सुझाव देता हूं। मैं इस मामले आप प्रविष्टि से पहले आईडी जेनरेट कर सकते हैं:

update B set NewID = NEWID() 

insert into A(fname,lname,id) select fname,lname,NewID from B 
127

2005 से ouput खंड का उपयोग करें:

DECLARE @output TABLE (id int) 

Insert into A (fname, lname) 
OUTPUT inserted.ID INTO @output 
SELECT fname, lname FROM B 

select * from @output 

अब आपकी तालिका चर सभी पंक्तियों आप सम्मिलित की पहचान मान होते हैं।

+2

लेकिन फिर आप तालिका बी को कैसे अपडेट करते हैं? मेरा मतलब है, आप बी में रिकॉर्ड के साथ @output के प्रत्येक रिकॉर्ड को कैसे जोड़ते हैं? यदि आप fname का उपयोग कर रहे हैं, तो एक कुंजी के रूप में lname तो njr के समाधान का उपयोग करने के लिए आसान है। – munissor

+2

@munissor, मुझे पता है कि यह एक पुराना धागा है, लेकिन [यह सरल-बात लेख] देखें (http://www.simple-talk.com/sql/learn-sql-server/working-with-the-insert -स्टेटमेंट-इन-एसक्यूएल-सर्वर /) विषय पर। "एक आउटपुट खंड जोड़ना" अनुभाग देखें। –

+1

@munissor थोड़ी देर हो चुकी है लेकिन आप 'आउटपुट डालने वाले .id, inserted.whatever भी कर सकते हैं @ आउटपुट' –

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