Artikel ini menawarkan lima opsi untuk memeriksa apakah ada tabel di SQL Server. Sebagian besar opsi melibatkan kueri tampilan sistem, tetapi salah satu opsi menjalankan prosedur tersimpan sistem, dan opsi lainnya melibatkan fungsi.
Saya juga menyertakan beberapa IF
simple sederhana pernyataan yang dapat dimodifikasi agar sesuai dengan keadaan Anda.
Opsi 1 – Tampilan sys.tables
Opsi ini menanyakan sys.tables
tampilan katalog sistem. Tampilan ini mengembalikan baris untuk setiap tabel pengguna. Oleh karena itu, Anda dapat menanyakannya menggunakan nama tabel yang Anda periksa.
Contoh:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Hasil:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Anda juga dapat menambahkan nama skema ke hal-hal yang Anda periksa. Berikut cara mengubah kueri sebelumnya untuk menyertakan nama skema:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Hasil:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Perhatikan bahwa sys.tables
view hanya mengembalikan ID skema jadi saya harus meneruskannya ke SCHEMA_NAME()
fungsi untuk mendapatkan namanya. Atau saya bisa menggunakan ID skema jika saya tahu itu.
Contoh:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Hasil:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Opsi 2 – Prosedur Tersimpan sp_tables
Opsi berikutnya mengeksekusi sp_tables
prosedur tersimpan.
Berikut adalah seberapa ringkas kode Anda saat menggunakan metode ini:
sp_tables 'Artists'
Hasil:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Namun, prosedur tersimpan ini mengembalikan tampilan serta tabel, jadi ada baiknya untuk mempersempitnya menjadi hanya tabel (kecuali jika Anda juga tertarik untuk mengembalikan tampilan). Untuk mempersempitnya menjadi tabel saja, gunakan @table_type = "'TABLE'"
.
Saat melakukannya, Anda juga dapat menentukan pemilik tabel dan qualifier tabel.
Contoh:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Hasil:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Penting untuk dicatat bahwa @table_type
parameter menerima daftar yang dipisahkan koma. Oleh karena itu, ini sedikit berbeda dengan parameter lainnya. @table_type
nilai harus diapit oleh tanda kutip ganda, dan setiap item diapit oleh tanda kutip tunggal. Dalam contoh saya, hanya ada satu item daftar, namun tetap harus diapit oleh tanda kutip ganda dan tunggal.
Opsi 3 – INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES
tampilan sistem mengembalikan satu baris untuk setiap tabel atau tampilan dalam database saat ini yang izinnya dimiliki oleh pengguna saat ini. Ini mirip dengan sys.tables
, tetapi mengembalikan lebih sedikit kolom. Tampilan skema informasi yang disertakan dalam SQL Server sesuai dengan definisi standar ISO untuk INFORMATION_SCHEMA.
Berikut ini contoh penggunaannya untuk memeriksa apakah ada tabel di database saat ini:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Hasil:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Ini dia lagi, tapi kali ini saya juga tentukan skemanya:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Hasil:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Opsi 4 – Fungsi OBJECT_ID()
Anda juga dapat menggunakan fungsi seperti OBJECT_ID()
untuk melihat apakah itu mengembalikan nilai non-NULL.
Contoh:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Hasil:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Dalam hal ini, tabel ada. Perhatikan bahwa saya menggunakan U
untuk menunjukkan jenis objek (tabel yang ditentukan pengguna).
Anda juga dapat memberikan nama tiga bagian untuk menyertakan database dan skema:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Hasil:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Jika tabel tidak ada, Anda akan mendapatkan NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Hasil:
+----------+ | Result | |----------| | NULL | +----------+
Lihat di bawah untuk contoh penggunaan ini dalam IF
pernyataan.
Opsi 5 – Tampilan sys.objects
Seolah-olah tidak ada contoh sebelumnya yang akan melakukan pekerjaan itu, inilah cara lain untuk memeriksa apakah ada tabel.
Kali ini saya menanyakan sys.objects
tampilan katalog sistem. Tampilan ini mengembalikan baris untuk setiap objek cakupan skema yang ditentukan pengguna dalam database. Itu tidak hanya mengembalikan tabel, itu mengembalikan semua jenis objek. Oleh karena itu kita perlu mempersempitnya menjadi tabel saja. Dalam hal ini saya hanya tertarik pada tabel yang ditentukan pengguna, jadi saya dapat menggunakan type = 'U'
(U
adalah untuk “USER_TABLE”). Atau, Anda dapat menggunakan TYPE_DESC = 'USER_TABLE'
.
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Hasil:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Ini dia lagi, tetapi menentukan skema:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Hasil:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Opsi 6 – Tampilan sys.sysobjects (HINDARI)
Opsi ini hanya terdaftar sehingga saya dapat merekomendasikan untuk tidak menggunakannya. sys.sysobjects
tampilan disertakan dalam SQL Server untuk kompatibilitas mundur, dan Microsoft menyarankan agar Anda menghindari penggunaan tampilan ini di pekerjaan mendatang.
Jika Anda menemukan kode yang menggunakan tampilan ini, pertimbangkan untuk memodifikasinya menggunakan sys.objects
atau tampilan sistem atau prosedur tersimpan lainnya.
Bagaimanapun, inilah contoh sebelumnya jika menggunakan sys.sysobjects
bukannya sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Hasil:
+-----------+ | id | |-----------| | 885578193 | +-----------+
JIKA Pernyataan 1
Berikut IF
sederhananya pernyataan yang memeriksa keberadaan tabel, kemudian mencetak pesan yang berbeda tergantung pada hasilnya. Kode ini dapat dimodifikasi sesuai dengan kebutuhan spesifik Anda.
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Hasil:
The table exists
Dan inilah tampilannya saat tabel tidak ada:
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Hasil:
The table does not exist
JIKA Pernyataan 2
Ini IF
lainnya pernyataan yang dapat dimodifikasi sesuai dengan kebutuhan spesifik Anda.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Hasil:
The table exists