एकाधिक रिकॉर्ड कैसे सम्मिलित करें और पहचान मान कैसे प्राप्त करें?

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

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
एंडी इरविंग का जवाब सबसे अच्छा है। ट्रिगर्स बेकार हैं और अपनी लक्षित तालिका पर मनमाने ढंग से संचालन के लिए अच्छी तरह से काम नहीं करते हैं, खासकर यदि आपका लक्ष्य अस्थायी है या सिर्फ मध्यवर्ती है। डैरेन का जवाब गलत है, यदि आप पंक्तियों का एक सेट डाल रहे हैं, तो लक्ष्य तालिका में उनका क्रम आवश्यक रूप से आपके सेट के क्रम के समान नहीं है। दिमित्री का रास्ता खराब है क्योंकि इसे धीमी प्रदर्शन के अनुसार एक पंक्ति में डालने के लिए एक लूप की आवश्यकता होती है, जब आप कर सकते हैं तो हमेशा सेट का उपयोग करें। कॉरी का रास्ता खराब है और उसने समझाया, "जब तक वे संघर्ष नहीं करते हैं।" यह शनिवार की रात सी में बदल
जोड़ा लेखक clemahieu, स्रोत
मुझे एहसास है कि यह एक पुराना सवाल है और यह SQL सर्वर 2005 निर्दिष्ट करता है लेकिन चूंकि यह 2008 में उपलब्ध MERGE कथन को प्रदर्शित करने वाला पहला परिणाम है और बाद में समाधान की तलाश करने वालों के लिए इसका उल्लेख किया जाना चाहिए। लक्ष्यीकरण योग्य उपयोग में चयन करें (चयन करें ....) स्रोत पर 1 = 2 जब उसमें शामिल नहीं किया जाता है .... आउटपुट डालें। TempTable (InsertedID) में डालें
जोड़ा लेखक oldegreyg, स्रोत
आपको एक साधारण डालने के लिए विलय की आवश्यकता नहीं है। मर्ज एक डालने/अपडेट के लिए अच्छा है, लेकिन एक साधारण डालने के लिए ओवरकिल। एंडी के आउटपुट जवाब ने मेरे लिए काम किया और इंडेक्स लॉक को दूर करने में मदद की।
जोड़ा लेखक CodeMonkeyForHire, स्रोत

7 उत्तर

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

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

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

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

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

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

set identity_insert A on
0
जोड़ा
वह तालिका ए को अपडेट करने की कोशिश नहीं कर रहा है, वह तालिका बी को अपडेट करने का प्रयास कर रहा है। तालिका बी में पहचान कॉलम नहीं है।
जोड़ा लेखक njr101, स्रोत

अपने प्रश्न को ध्यान से पढ़ना, आप तालिका ए में नए पहचान मानों के आधार पर तालिका बी को अपडेट करना चाहते हैं।

सम्मिलित होने के बाद, बस एक अद्यतन चलाएं ...

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

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

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

0
जोड़ा

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

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

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

0
जोड़ा

यदि आप हमेशा इस व्यवहार को चाहते हैं, तो आप टेबलए पर एक बार INSERT ट्रिगर डाल सकते हैं जो तालिका बी अपडेट करेगा।

0
जोड़ा

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

update B set NewID = NEWID()

insert into A(fname,lname,id) select fname,lname,NewID from B
0
जोड़ा

2005 से आउटपुट खंड का प्रयोग करें:

DECLARE @output TABLE (id int)

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

select * from @output

अब आपके टेबल वैरिएबल में आपके द्वारा डाली गई सभी पंक्तियों के पहचान मान हैं।

0
जोड़ा
@munissor, मुझे पता है यह एक पुराने धागा है, लेकिन एक href की जाँच <= "http://www.simple-talk.com/sql/learn-sql-server/working-with-the-insert-statement-in विषय पर -sql-server/"rel =" nofollow noreferrer "> यह सरल-बात आलेख । "एक आउटपुट खंड जोड़ना" अनुभाग देखें।
जोड़ा लेखक Mr Moose, स्रोत
ध्यान दें कि जब तालिका ए में ट्रिगर होता है तो यह खराब तरीके से विफल रहता है, क्योंकि माइक्रोसॉफ्ट एक बग जिसे ठीक करने से इंकार कर देता है। एक और कामकाज यहां है: stackoverflow.com/q/13198476/2557263
जोड़ा लेखक Alejandro, स्रोत
@munissor थोड़ा देर हो चुकी है लेकिन आप output inserted.id, inserted.whatever भी कर सकते हैं @output
जोड़ा लेखक Dennis Rongo, स्रोत
लेकिन फिर आप टेबल बी को कैसे अपडेट करते हैं? मेरा मतलब है, आप बी में रिकॉर्ड के साथ @output के प्रत्येक रिकॉर्ड को कैसे जोड़ते हैं? यदि आप fname का उपयोग कर रहे हैं, तो एक कुंजी के रूप में lname तो njr के समाधान का उपयोग करने के लिए आसान है।
जोड़ा लेखक munissor, स्रोत
@DennisRongo केवल तभी inserted.whateverColumn एक और अद्वितीय पहचानकर्ता है ...
जोड़ा लेखक Mark, स्रोत