Saya ingin ini menjadi diskusi utama tentang cara memeriksa apakah tabel ada di SQL Server 2000/2005 menggunakan Pernyataan SQL.
Ketika Anda mencari jawabannya di Google, Anda mendapatkan begitu banyak jawaban berbeda. Apakah ada cara resmi / mundur dan maju yang kompatibel untuk melakukannya?
Berikut adalah dua cara yang mungkin untuk melakukannya. Yang mana di antara keduanya yang merupakan cara standar / terbaik untuk melakukannya?
Cara pertama:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
Cara kedua:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL menyediakan yang sederhana
SHOW TABLES LIKE '%tablename%';
pernyataan. Saya mencari yang serupa.
Jawaban:
Untuk kueri seperti ini, selalu lebih baik menggunakan
INFORMATION_SCHEMA
tampilan. Pandangan ini (kebanyakan) standar di banyak basis data yang berbeda dan jarang berubah dari versi ke versi.Untuk memeriksa apakah ada tabel gunakan:
sumber
SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Perhatikan juga bahwa jika karena alasan apa pun Anda perlu memeriksa tabel sementara Anda dapat melakukan ini:
sumber
Kami selalu menggunakan
OBJECT_ID
gaya selama saya ingatsumber
OBJECT_ID('TableName', 'U')
untuk menjamin objek adalah tabel.IF EXISTS
kueri dari jawaban yang diterima berulang-ulang. Plus, semuanya samar sampai Anda membaca dokumentasi, terutama di T-SQL (atau varian lainnya, benar-benar).Silakan lihat pendekatan di bawah ini,
Pendekatan 1: Menggunakan tampilan INFORMATION_SCHEMA.TABLES
Kami dapat menulis kueri seperti di bawah ini untuk memeriksa apakah Tabel Pelanggan ada di database saat ini.
Pendekatan 2: Menggunakan fungsi OBJECT_ID ()
Kami dapat menggunakan fungsi OBJECT_ID () seperti di bawah ini untuk memeriksa apakah Tabel Pelanggan ada di database saat ini.
Pendekatan 3: Menggunakan Tampilan Katalog sys.Objects
Kita dapat menggunakan tampilan katalog Sys.Objects untuk memeriksa keberadaan Tabel seperti yang ditunjukkan di bawah ini:
Pendekatan 4: Menggunakan Tampilan Katalog sys.Tables
Kita dapat menggunakan tampilan katalog Sys.Tables untuk memeriksa keberadaan Tabel seperti yang ditunjukkan di bawah ini:
Pendekatan 5: Hindari Menggunakan Tabel Sistem sys.sysobjects
Kita harus menghindari penggunaan Tabel Sistem sys.sysobjects secara langsung, akses langsung ke sana akan ditinggalkan di beberapa versi Sql Server yang akan datang. Sesuai tautan Microsoft BOL, Microsoft menyarankan untuk menggunakan katalog lihat sys.objects / sys.tables daripada tabel sistem sys.sysobjects secara langsung.
dirujuk dari: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
sumber
Mencari tabel di database yang berbeda:
sumber
Hanya ingin menyebutkan satu situasi di mana mungkin akan sedikit lebih mudah untuk menggunakan
OBJECT_ID
metode ini. TheINFORMATION_SCHEMA
pandangan benda bawah masing-masing database-https://msdn.microsoft.com/en-us/library/ms186778.aspx
Karena itu semua tabel yang Anda akses menggunakan
hanya akan mencerminkan apa yang ada di dalamnya
[database]
. Jika Anda ingin memeriksa apakah tabel di database lain ada, tanpa secara dinamis mengubah[database]
setiap kali,OBJECT_ID
akan membiarkan Anda melakukan ini di luar kotak. Ex-bekerja sama baiknya dengan
Sunting SQL SERVER 2016 :
Dimulai dengan 2016, Microsoft menyederhanakan kemampuan untuk memeriksa objek yang tidak ada sebelum dijatuhkan, dengan menambahkan
if exists
kata kunci kedrop
pernyataan. Sebagai contoh,akan melakukan hal yang sama dengan
OBJECT_ID
/INFORMATION_SCHEMA
pembungkus, dalam 1 baris kode.https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
sumber
sumber
Menggunakan Skema Informasi adalah cara standar SQL untuk melakukannya, sehingga harus digunakan oleh semua database yang mendukungnya.
sumber
Di sini, dalam kode di atas, nama tabelnya adalah
Mapping_APCToFANavigator
.sumber
{ }
) pada bilah alat editor untuk memformat dan sintaksis dengan baik!Jika Anda perlu bekerja pada basis data yang berbeda:
sumber
Saya tahu ini adalah pertanyaan lama tetapi saya telah menemukan kemungkinan ini jika Anda berencana untuk sering menyebutnya.
sumber
sysname
tipe data tidakvarchar(50)
. Seharusnya tidak menggunakansysobjects
tampilan usang dan tidak memperhitungkan skema.Anda dapat menggunakan kode di bawah ini
Atau
sumber
Cukup tambahkan di sini, untuk kepentingan pengembang dan sesama DBA
skrip yang menerima @Tablename sebagai parameter
(yang mungkin atau mungkin tidak mengandung schemaname) dan mengembalikan info di bawah ini jika schema.table ada:
Saya membuat skrip ini untuk digunakan di dalam skrip lain setiap kali saya perlu menguji apakah ada tabel atau tampilan, dan ketika ada, dapatkan object_id untuk digunakan untuk keperluan lain.
Ini memunculkan kesalahan ketika Anda memberikan string kosong, nama skema yang salah atau nama tabel yang salah.
ini bisa berada di dalam prosedur dan mengembalikan -1 misalnya.
Sebagai contoh, saya memiliki tabel yang disebut "Facts.FactBackOrder" di salah satu basis data Gudang Data saya.
Beginilah cara saya mencapai ini:
sumber
dbo.[hello.world ]
dan skrip tidak akan menemukannya karena beberapa alasan. Yang mengatakan, tidak mungkin ada orang yang mau membuat tabel seperti itu, tapi tetap saja. Lagi pula,THE_NAME
kolom Anda didefinisikan sebagaisysname', yet you try to squeeze 2
kolom sysname` dan sebuah titik (.
), semuanya dikelilingi tanda kurung siku di sana ... bahwa suatu hari pasti akan gagal!Di SQL Server 2000 Anda dapat mencoba:
sumber
sumber
Sesuatu yang penting untuk diketahui bagi siapa saja yang belum menemukan solusi mereka: SQL server! = MYSQL . Jika Anda ingin melakukannya dengan MYSQL , itu cukup sederhana
Posting ini di sini karena ini adalah hit teratas di Google.
sumber
sumber
Anda bisa menggunakan ini:
sumber
sumber
- - buat prosedur untuk memeriksa apakah ada tabel
- - cara menggunakan: periksa apakah migrasi tabel ada
sumber
sumber
saya ambil di sini membuat tampilan sebagai contoh .
Karena perintah ALTER / BUAT tidak dapat berada dalam blok BEGIN / END. Anda perlu menguji keberadaan dan menjatuhkannya sebelum melakukan pembuatan
Jika Anda kuatir tentang izin yang hilang, Anda juga dapat membuat skrip pernyataan GRANT dan menjalankannya kembali di akhir.
Anda bisa membungkus buat / ubah menjadi string dan melakukan EXEC - yang mungkin jelek untuk tampilan besar
sumber
Jika ada yang mencoba melakukan hal yang sama di linq ke sql (atau terutama linqpad) aktifkan opsi untuk menyertakan tabel dan tampilan sistem dan lakukan kode ini:
mengingat bahwa Anda memiliki objek dengan nama di properti yang disebut item, dan skema di properti yang disebut skema di mana nama variabel sumber adalah
a
sumber
Jika ini adalah diskusi 'utama', maka harus dicatat bahwa skrip Larry Leonard dapat meminta server jarak jauh juga jika server terhubung.
sumber
Saya mempunyai beberapa masalah dengan memilih dari INFORMATIONAL_SCHEME dan OBJECT_ID. Saya tidak tahu apakah ini masalah driver ODBC atau sesuatu .. Permintaan dari studio manajemen SQL, keduanya, baik-baik saja.
Ini solusinya:
Jadi, jika kueri gagal, mungkin, tidak ada tabel seperti itu di database (atau Anda tidak memiliki izin akses ke sana).
Pemeriksaan dilakukan dengan membandingkan nilai (integer dalam kasus saya) yang dikembalikan oleh pelaksana SQL yang berkaitan dengan driver ODBC ..
sumber
Ada satu opsi lagi untuk memeriksa apakah tabel ada di seluruh database
sumber
Jalankan kueri ini untuk memeriksa apakah tabel ada di database:
sumber
pertimbangkan dalam satu database Anda memiliki tabel t1. Anda ingin menjalankan skrip pada Database lain seperti - jika t1 ada maka jangan lakukan yang lain buat t1. Untuk melakukan studio visual terbuka ini dan lakukan hal berikut:
Klik kanan pada t1, lalu Script table as, lalu DROP dan Create To, lalu New Query Editor
Anda akan menemukan permintaan yang Anda inginkan. Tetapi sebelum menjalankan skrip itu jangan lupa untuk mengomentari pernyataan drop dalam kueri karena Anda tidak ingin membuat yang baru jika sudah ada.
Terima kasih
sumber