Menyimpan hasil insert yang disimpan ke suatu tabel dari suatu tabel ke dalam tabel lain
Pada siang hari yang cerah ini saya akan membagikan ilmu baru (karena saya pun baru mengetahuinya sambil menunggu pekerjaan baru). Apa itu?? Mungkin teman-teman pernah mengalami hal yang sama dengan kasus yang pernah saya alami. Suatu ketika teman-teman diharuskan memasukkan data ke suatu tabel (input data) dengan jumlah data yang sangat besar, namun saat proses insert data tersebut gagal di tengah proses (entah oleh data yang tidak valid ataupun koneksi yang terputus) dan tidak diperbolehkan proses Rollback data tetapi user ingin mengetahui data apa saya yang telah berhasil ter-insert dalam tabel tersebut. Mungkin solusi pertama kita bisa buat sebuah flag dalam tabel tersebut dimana flag tersebut diupdate saat semua proses insert berhasil dilakukan sampai selesai. Tetapi bila ternyata tabel tersebut tidak ada kolom untuk tempat flag dan kita tidak diperkenankan menambah kolom dari tabel tersebut, maka solusi berikut mungkin akan sangat berguna untuk menyelesaikan kasus tersebut. Lalu, apa solusinya?? Apa querynya??
Kita bisa menggunakan pola script berikut :
[sourcecode language=”sql”]
INSERT [tabel_tujuan]
OUTPUT INSERTED.*
INTO [tabel_monitor]
SELECT *
FROM [tabel_sumber]
[/sourcecode]
dimana :
tabel_tujuan = tabel yang akan di-insert
tabel_monitor = tabel tempat untuk menyimpan data yang berhasil diinsert selama proses (bisa berupa table temporary maupun table variable. Penjelasan keduanya insya ALLAH akan saya jelaskan di lain kesempatan)
tabel_sumber = tabel yang menjadi sumber data untuk diinsert
Sebagai latihan, kita bisa menggunakan tabel-tabel pada artikel berikut Join pada SQL Server. Di sini kita akan menggunakan tabel barang sebagai latihan kita. Lalu tambahkan tabel produk menggunakan script berikut :
[sourcecode language=”sql”]
USE [produksi]
CREATE TABLE [dbo].[produk] (
[kode_produk] varchar NOT NULL,
[kode_gudang] varchar NULL,
[nama_produk] varchar NULL,
CONSTRAINT [PK_produk] PRIMARY KEY CLUSTERED ([kode_produk] ASC) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY],
CONSTRAINT [IX_produk] UNIQUE NONCLUSTERED ([kode_produk] ASC) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
[/sourcecode]
Kemudian kita coba untuk melihat data hasil insert dengan query berikut :
[sourcecode language=”sql”]
DECLARE @produk_inserted TABLE (
[kode_produk] varchar NOT NULL,
[kode_gudang] varchar NULL,
[nama_produk] varchar NULL
)
INSERT produk
OUTPUT INSERTED.*
INTO @produk_inserted
SELECT *
FROM barang
[/sourcecode]
Di sini saya menggunakan table variable sebagai penampung data hasil insert. Saat terjadi masalah saat proses di atas berlangsung, kita dapat melihat data apa saja yang berhasil di-insert dengan select pada table variable.
[sourcecode language=”sql”]
SELECT *
FROM @produk_inserted
[/sourcecode]
Demikian artikel singkat ini, mudah2an bermanfaat… 😀
Pingback: INSERT INTO … VALUES … , INSERT INTO …. SELECT, dan SELECT … INTO …. | Agunahwan's Blog