Cara menyisipkan beberapa catatan dan mendapatkan nilai identitas?

I'm memasukkan beberapa record ke dalam tabel dari tabel yang lain B. Apakah ada cara untuk mendapatkan identitas nilai dari tabel A record dan update tabel b rekor dengan melakukan kursor?

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

I'm menggunakan MS SQL Server 2005.

Mengomentari pertanyaan (3)

Gunakan ouput klausul dari tahun 2005:

DECLARE @output TABLE (id int)

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

select * from @output

sekarang anda meja variabel memiliki nilai-nilai identitas dari semua baris anda masukkan.

Komentar (5)

Membaca pertanyaan dengan hati-hati, anda hanya ingin memperbarui tabel B berdasarkan identitas baru nilai-nilai pada tabel A.

Setelah insert selesai, jalankan update...

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

Ini mengasumsikan bahwa FName / LName kombinasi dapat digunakan untuk pertandingan kunci catatan antara tabel. Jika hal ini tidak terjadi, anda mungkin perlu untuk menambahkan bidang tambahan untuk memastikan catatan pertandingan dengan benar.

Jika anda don't memiliki kunci alternatif yang memungkinkan anda untuk mencocokkan catatan itu tidak't masuk akal sama sekali, karena record di tabel B dapat't dapat dibedakan dari satu sama lain.

Komentar (0)

Sejauh yang saya mengerti masalah yang anda mengalami adalah yang ingin anda SISIPKAN ke dalam Tabel A, yang memiliki identitas kolom, dan anda ingin melestarikan identitas dari Tabel B yang tidak.

Dalam rangka untuk melakukan itu anda hanya harus memiliki untuk mengaktifkan identitas insert pada tabel A. hal Ini akan memungkinkan anda untuk menentukan ID anda's pada menyisipkan dan selama mereka don't konflik, anda harus baik-baik saja. Kemudian anda hanya dapat melakukan:

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

Tidak yakin apa yang DB anda menggunakan tapi untuk sql server perintah untuk mengaktifkan identitas menyisipkan akan sama:

set identity_insert A on
Komentar (1)

Jika anda selalu ingin perilaku ini, anda bisa menempatkan aplikasi SETELAH MEMASUKKAN pemicu di TableA yang akan memperbarui tabel B.

Komentar (0)

Saya sarankan menggunakan uniqueidentifier jenis yang bukan identitas. Saya hal ini anda dapat menghasilkan Id sebelum penyisipan:

update B set NewID = NEWID()

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

Anda bisa mendapatkan dengan bergabung di nomor baris. Hal ini dimungkinkan karena sejak itu's identitas, itu hanya akan bertambah saat anda menambahkan item yang akan berada di urutan yang anda memilih mereka.

Komentar (1)
Larutan

MBelly adalah benar pada uang - Tapi kemudian memicu akan selalu mencoba dan update tabel B bahkan jika itu's tidak diperlukan (Karena anda're juga memasukkan dari tabel C?).

Darren juga benar di sini, anda bisa't mendapatkan beberapa identitas kembali sebagai hasil set. Pilihan anda adalah dengan menggunakan kursor dan mengambil identitas untuk setiap baris yang anda masukkan, atau menggunakan Darren's pendekatan menyimpan identitas sebelum dan setelah. Asalkan anda tahu kenaikan identitas ini harus bekerja, asalkan anda pastikan tabel yang terkunci untuk semua tiga peristiwa.

Jika itu saya, dan itu bukan't waktu kritis I'd pergi dengan kursor.

Komentar (0)