Saya menulis prosedur tersimpan dalam SQL Server 2008. Saya perlu memeriksa apakah ada tabel di database. Jika tidak maka saya harus membuatnya.
Bagaimana saya melakukan ini?
Saya menulis prosedur tersimpan dalam SQL Server 2008. Saya perlu memeriksa apakah ada tabel di database. Jika tidak maka saya harus membuatnya.
Bagaimana saya melakukan ini?
CREATE TABLE IF NOT EXISTS ...
Jawaban:
Sesuatu seperti ini
sumber
if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
Hanya untuk kontras, saya suka menggunakan fungsi object_id seperti yang ditunjukkan di bawah ini. Ini sedikit lebih mudah dibaca, dan Anda tidak perlu khawatir tentang sys.objects vs sysobjects vs sys.all_objects vs sys.tables. Bentuk dasar:
Tentu saja ini akan menunjukkan sebagai "Hadir" jika ada setiap objek hadir dengan nama itu. Jika Anda ingin memeriksa tabel saja, Anda perlu:
Ini berfungsi untuk tabel temp juga:
sumber
Mari kita buat contoh database dengan tabel dengan skrip di bawah ini:
Pendekatan 1: Menggunakan tampilan INFORMATION_SCHEMA.TABLES
Kami dapat menulis kueri seperti di bawah ini untuk memeriksa apakah Tabel tblTest ada di database saat ini.
Kueri di atas memeriksa keberadaan tabel tblTest di semua skema di database saat ini. Alih-alih ini jika Anda ingin memeriksa keberadaan Tabel dalam Skema tertentu dan Basis Data Tertentu, maka kami dapat menulis kueri di atas seperti di bawah ini:
Kelebihan dari Pendekatan ini: Tampilan INFORMATION_SCHEMA bersifat portabel di seluruh sistem RDBMS yang berbeda, sehingga porting ke RDBMS yang berbeda tidak memerlukan perubahan apa pun.
Pendekatan 2: Menggunakan fungsi OBJECT_ID ()
Kita bisa menggunakan
OBJECT_ID()
fungsi seperti di bawah ini untuk memeriksa apakah ada Tabel tblTest di database saat ini.Menentukan bagian Nama Database dan Nama Skema untuk Nama Tabel adalah opsional. Tetapi menentukan Nama Basis Data dan Nama Skema memberikan opsi untuk memeriksa keberadaan tabel dalam database yang ditentukan dan dalam skema tertentu, alih-alih memeriksa database saat ini di semua skema. Kueri di bawah ini menunjukkan bahwa meskipun database saat ini adalah database MASTER, kami dapat memeriksa keberadaan
tblTest
tabel dalamdbo
skema dalamTest
database.Pro: Mudah diingat. Satu hal penting lainnya untuk menyebutkan tentang
OBJECT_ID()
fungsi adalah: ia menyediakan opsi untuk memeriksa keberadaan Tabel Sementara yang dibuat dalam konteks koneksi saat ini. Semua Pendekatan lain memeriksa keberadaan Tabel Sementara yang dibuat di semua konteks koneksi, bukan hanya konteks koneksi saat ini. Kueri di bawah ini menunjukkan cara memeriksa keberadaan Tabel Sementara menggunakanOBJECT_ID()
fungsi:Pendekatan 3: Menggunakan Tampilan Katalog sys.Objects
Kita dapat menggunakan tampilan
Sys.Objects
katalog untuk memeriksa keberadaan Tabel seperti yang ditunjukkan di bawah ini:Pendekatan 4: Menggunakan Tampilan Katalog sys.Tables
Kita dapat menggunakan tampilan
Sys.Tables
katalog untuk memeriksa keberadaan Tabel seperti yang ditunjukkan di bawah ini:Sys.Tables
tampilan katalog mewarisi baris dari tampilanSys.Objects
katalog,Sys.objects
tampilan katalog disebut sebagai tampilan dasar di manasys.Tables
disebut sebagai tampilan turunan.Sys.Tables
akan mengembalikan baris hanya untuk objek Tabel sedangkanSys.Object
tampilan terpisah dari mengembalikan baris untuk objek tabel, ia mengembalikan baris untuk objek seperti: prosedur tersimpan, tampilan dll.Pendekatan 5: Hindari Menggunakan Tabel Sistem sys.sysobjects
Kita harus menghindari menggunakan
sys.sysobjects
Tabel Sistem secara langsung, akses langsung ke itu akan ditinggalkan di beberapa versi Sql Server. Sesuai tautan [Microsoft BOL] [1], Microsoft menyarankan untuk menggunakan tampilan katalogsys.objects/sys.tables
alih-alihsys.sysobjects
tabel sistem secara langsung.Referensi: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
sumber
Diedit
Anda dapat melihat sys.tables untuk memeriksa keberadaan tabel yang diinginkan:
sumber
sumber
sumber
Coba pernyataan berikut untuk memeriksa keberadaan tabel di database:
Anda dapat membuat tabel di dalam blok if.
sumber
sysobjects
adalah tampilan kompatibilitas yang hanya ada untuk menghindari melanggar kode yang lebih lama. Saran saya adalah menggunakan tampilan katalog sistem (misalnyasys.objects
,sys.tables
) untuk kode yang hanya akan menargetkan instance SQL Server 2008, dan tampilan skema informasi (misalnyainformation_schema.tables
) untuk kode yang perlu portabel. Anda dapat menemukan informasi lebih lanjut tentang pandangan yang berbeda di sini:Jika saya tidak salah, ini akan berhasil:
sumber