2010-10-13 12 views
5

Bir tabloya veri eklemeden önce Id (IDENTITY) için yeni değerler almak mümkün mü?Bir tabloya veri eklemeden önce Id (IDENTITY) için yeni değerler almak mümkün mü?

Is böyle bir şey yazmak mümkündür: Ben, Tablo-1'de verilerini eklemek ve istedikleri için

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

Ben Id değerlerini ihtiyaç hemen sonra, yabancı bir anahtara sahip başka tabloda eklemek bilgi (Id) ile Tablo1 bağlantılı

cevap

6

IDENT_CURRENT. Belirtilen bir tablo veya görünüm için oluşturulan son kimlik değerini döndürür. Oluşturulan son kimlik değeri, herhangi bir oturum ve herhangi bir kapsam için olabilir.

SCOPE_IDENTITY. Aynı kapsamda bir kimlik sütununa eklenen son kimlik değerini döndürür. Kapsam, bir modüldür: saklı yordam, tetikleyici, işlev veya toplu iş.

OUTPUT. INSERT, UPDATE, DELETE veya MERGE deyiminden etkilenen her satırdaki bilgileri veya ifadeleri temel alarak döndürür. [...] OUTPUT yan tümcesi, bir INSERT veya UPDATE işleminden sonra kimlik veya hesaplanan sütunların değerini almak için yararlı olabilir.

+2

Hiçbir zaman hiçbir koşul altında ident_current kullanın, bunun için birden fazla kullanıcınız varsa doğru sonucu vermeyecektir! Sürümünüz çıktı çıktısını desteklemiyorsa çıktı en iyi seçimdir veya scope_identity(). – HLGEM

0

Resim, yeni kimlik değerini üreten bir satır ekleme işlemidir için.

istediğini yapmak için, sadece

+0

@@ kimliğini dolum için çok tehlikelidir Doğru sonuçları güvenilir şekilde kullanmayın ve kullanmayacaktır. Bunu bu amaçla kullanmazsın. – HLGEM

0

Neden insert yapmadan önce kimlik değeri elde etmek gerekir INSERT sonra

SELECT newid = @@identity FROM table 

? Sadece Insert2 SCOPE_IDENTITY() döndüren Tablo2'ye yerleştirin ve sonra ekleme işleminiz için Tablo1'e olan Id değerini kullanın.

+0

Çünkü bir toplu iş parçacığı yapmak istiyorum (satır satır eklemeyin) –

+1

için Bu durumda, hayır, bunu yapamazsınız. @smirkingman cevabında belirttiği gibi, her satır ekinden sonra kimliği almanız gerekir. –

+0

@AJ: Tamam, teşekkürler –

2

da ekleme deyimini daha sonra kullanılmak üzere, yeni eklenen değeri döndürmek olabilir. örneğin

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

Bu sadece hızlı demodur. Güncelleme eklemek için yeni kimliği kullanabilir, başka bir tabloya, sorguya vb. Başka bir şekilde ekleyebilirsiniz. sonrası

-- 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]
soruya tabloları çoğaltılması düzenleme, ben biçimlendirme sırasında komut dosyası içine hataları eklemek vermedi umut ve verilerle

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) 
İlgili konular