2010-10-13 7 views
5

किसी तालिका में डेटा डालने से पहले आईडी (पहचान) के लिए नए मान प्राप्त करना संभव है?किसी तालिका में डेटा डालने से पहले आईडी (पहचान) के लिए नए मान प्राप्त करना संभव है?

संभव है ऐसा ही कुछ लिखने के लिए:

INSERT INTO Table1 
SELECT *GET_NEW_IDENTITY*, Field1, Field2 FROM Table2 

मैं ईद के मूल्यों की जरूरत है क्योंकि मैं Table1 में डेटा सम्मिलित करने के लिए और, चाहते हैं तो बस के बाद, एक और तालिका जो एक विदेशी कुंजी है में डालने डेटा Table1 (आईडी के साथ)

उत्तर

6

IDENT_CURRENT। निर्दिष्ट तालिका या दृश्य के लिए उत्पन्न अंतिम पहचान मान देता है। उत्पन्न अंतिम पहचान मूल्य किसी भी सत्र और किसी भी क्षेत्र के लिए हो सकता है।

SCOPE_IDENTITY। एक ही दायरे में एक पहचान कॉलम में डाला गया अंतिम पहचान मान देता है। एक गुंजाइश एक मॉड्यूल है: एक संग्रहीत प्रक्रिया, ट्रिगर, फ़ंक्शन, या बैच।

OUTPUT। INSERT, अद्यतन, हटाएं या MERGE कथन से प्रभावित प्रत्येक पंक्ति के आधार पर जानकारी, या अभिव्यक्ति देता है। [...] OUTPUT क्लॉज INSERT या UPDATE ऑपरेशन के बाद पहचान या गणना कॉलम के मान को पुनर्प्राप्त करने के लिए उपयोगी हो सकता है।

+2

किसी भी परिस्थिति में कभी भी इसके लिए ident_current का उपयोग न करें, यदि आपके पास एकाधिक उपयोगकर्ता हैं तो यह सही परिणाम नहीं देगा! आउटपुट सबसे अच्छा विकल्प या स्कोप_डिडिटी() है यदि आपका संस्करण आउटपुट क्लॉज का समर्थन नहीं करता है। – HLGEM

0

नहीं, क्योंकि यह एक पंक्ति जोड़ने का कार्य है जो नई पहचान मान बनाता है।

आप क्या चाहते करने के लिए,

SELECT newid = @@identity FROM table 

बस सम्मिलित

+0

@@ पहचान करने के लिए बहुत खतरनाक है उपयोग करें और विश्वसनीय परिणामों को विश्वसनीय रूप से वापस नहीं करेंगे। आप इस उद्देश्य के लिए इसका इस्तेमाल नहीं करते हैं। – HLGEM

0

तुम क्यों डालने करने से पहले पहचान मूल्य प्राप्त करने की आवश्यकता होगी के बाद? बस तालिका 2 में SCOPE_IDENTITY() लौटने के लिए सम्मिलित करें और उसके बाद तालिका 1 में अपने डालने के लिए परिणामी आईडी मान का उपयोग करें।

+0

क्योंकि मैं perf –

+1

के लिए बैच डालने (पंक्ति द्वारा पंक्ति डालें नहीं) करना चाहता हूं, उस स्थिति में, नहीं, आप इसे नहीं कर सकते हैं। प्रत्येक पंक्ति सम्मिलित करने के बाद आपको पहचान प्राप्त करनी होगी, क्योंकि @smirkingman ने अपने उत्तर में संकेत दिया था। –

+0

@AJ: ठीक है, धन्यवाद –

2

आप सम्मिलित कथन भी बाद में उपयोग के लिए नए सम्मिलित मूल्य को वापस कर सकते हैं। उदाहरण के लिए

create table demo(Id int identity primary key, data varchar(10)) 
go 
insert into demo(data) output inserted.Id values('something') 
0

यह केवल तेज़ डेमो है। आप अद्यतन के लिए सम्मिलित करने के लिए नई आईडी का उपयोग कर सकते हैं, किसी अन्य तालिका में, अन्य तालिका, क्वेरी आदि में डालें। आशा मैं स्वरूपण के दौरान स्क्रिप्ट में त्रुटियों को सम्मिलित नहीं किया था, संपादन पोस्ट

-- run [1] before this script once to have environment 

--create temporary table once if not dropped after 
-- really only ID field is needed, the others are for illustration 
create table #temp_id (Id int, d1 int, d2 int) 

select * from Table2;-- this is read-only, filled once here source 
select * from Table1;--interesting for following runs 

insert into Table1 
    OUTPUT INSERTED.id 
    -- really only ID is needed, the rest is for illustration 
    , inserted.d1, inserted.d2 INTO #temp_id 
select field1, field2, null-- null to be merged later 
-- or inserted/updated into another table 
    from Table2; 

select * from Table1; 
select * from #temp_id; 


MERGE Table1 AS TARGET 
    USING #temp_id AS SOURCE 
     ON (TARGET.id = SOURCE.id) 
    WHEN MATCHED 
--AND OR are redundant if Table1.ID is PK  
    THEN 
    UPDATE SET TARGET.IDnew = SOURCE.id; 


select * from Table1; 


--drop table #temp_id 
--drop table table1 
--drop table table2 

[1]
सवाल से टेबल Reproducing और डेटा के साथ भरने

create table Table1(Id int identity primary key, d1 int, d2 int, IDnew int) 
create table Table2(field1 int, field2 int) 
insert into table2 values(111,222) 
insert into table2 values(333,444) 
संबंधित मुद्दे