Hari ini saya melihat klausa keluaran di SQL Server 2005 sehingga Anda dapat mengembalikan data ke variabel tabel dari pernyataan modifikasi (INSERT, UPDATE, DELETE). Skenario yang berguna untuk DML dengan hasil mencakup pembersihan dan pengarsipan, aplikasi perpesanan, dan skenario lainnya. Sintaks klausa OUTPUT baru ini adalah:
OUTPUT <dml_select_list> INTO @table_variable
dapat mengakses gambar lama/baru dari baris yang dimodifikasi dengan mereferensikan tabel yang disisipkan dan tabel yang dihapus, dengan cara yang mirip dengan mengakses pemicu. Dalam pernyataan INSERT, hanya tabel yang disisipkan yang dapat diakses. Dalam pernyataan DELETE, hanya tabel yang dihapus yang dapat diakses. Dalam pernyataan UPDATE, Anda dapat mengakses tabel yang disisipkan dan tabel yang dihapus. Berikut ini adalah contoh dari MSDN:
Sebagai contoh skema pembersihan dan pengarsipan yang mungkin berguna untuk DML dengan hasil, asumsikan Anda memiliki tabel Pesanan yang besar dan Anda ingin menghapus data historis secara teratur. Anda juga ingin menyalin data yang dibersihkan ke tabel arsip bernama OrdersArchive. Anda mendeklarasikan variabel tabel bernama @DeletedOrders dan memasukkan loop di mana Anda menghapus data historis dalam beberapa bagian (misalnya, pesanan yang lebih lama dari tahun 2003). Kode yang ditambahkan di sini adalah klausa OUTPUT, yang menyalin semua atribut dari semua baris yang dihapus ke variabel tabel @DeletedOrders, dan kemudian menggunakan pernyataan INSERT INTO untuk menyalin semua baris dalam variabel tabel ke tabel OrdersArchive:
DECLARE @DeletedOrders TABLE
(
pesanan INT,
tanggal pemesanan DATETIME,
empidINT,
pelanggan VARCHAR(5),
jumlahINT
)
SAAT 1=1
MULAI
MULAI TRANS
HAPUS TOP (5000) DARI Pesanan
OUTPUT dihapus.* KE @DeletedOrders
DIMANA tanggal pemesanan < '20030101'
MASUKKAN KE Arsip Pesanan
PILIH * DARI @DeletedOrders
KOMITMEN TRAN
HAPUS DARI @DeletedOrders
JIKA @@jumlah baris < 5000
MERUSAK
END
Contoh lainnya adalah sebagai berikut. Jika terdapat tabel sebagai berikut: Buat tabel Employee(EmpID int identitas(1, 1) batasan Employee_pk primary key, FirstName varchar(100), LastName Varchar(100), Sex char(1), Salam ketika Jenis Kelamin = 'M' lalu 'Tuan' ketika Jenis Kelamin = 'F' lalu 'Ms.' yang lain '' berakhir, Uang Gaji, Pemotongan sebagai kasus Ketika Gaji <3000 maka 0,20 * Gaji ketika Gaji antara 30000 dan 50000 lalu .26* Gaji ketika Gaji antara 50001 dan 75000 lalu .30*Gajilainnya .35*Gaji berakhir, batasan tanggal dan waktu DOJ DOJ_DEF default getdate())
} Tabel yang sangat sederhana, di mana klausa digunakan untuk mengatur salam, pengurangan, doj, dll. Dan kita dapat membuat prosedur tersimpan lainnya, sebagai berikut: Buat procedure Employee_insert@Fname varchar(100),@Lname varchar(100),@sex char(1),@Salary Moneyasdeclare @empoutput table (EmpID int, FirstName varchar(100) , Nama Belakang Varchar(100),Karakter jenis kelamin(1), Karakter salam(3),Uang Gaji,Uang Pemotongan,waktu tanggal DOJ )masukkan ke Karyawan(NamaDepan,NamaBelakang,Gaji,jenis kelamin)OUTPUT dimasukkan.* ke dalam @empoutputvalues(@Fname ,@Lname ,@Gaji,@jenis kelamin )Pilih * dari @empoutput
Kemudian ketika memanggil prosedur tersimpan, Anda dapat menggunakan USE [MyDatabase] seperti ini
GOexec Employee_insert 'Miho','Yoshikawa','F',146000
Dengan cara ini, data akan dimasukkan ke dalam tabel karyawan selama eksekusi, dan empoutput variabel sementara akan ditentukan Didefinisikan dalam formulir, mudah dilihat di sini, dan data yang dimasukkan ke dalam tabel karyawan akan di-output ke variabel empoutput pada saat yang bersamaan. Setelah kita menjalankan prosedur tersimpan ini, kita akan menemukan hasil sebagai berikut
EmpID,Nama Depan,Nama Belakang,Jenis Kelamin,Salam,Gaji,Potongan,DOJ
7,Miho,Yoshikawa,F,Ms.,146000.00,51100.00,09-04-2006 23:16:44.920
, dan catatan memang dimasukkan ke dalam tabel karyawan
Anda dapat melihat
sumbernya: jackyrong BLOG