Pertanyaan Periksa apakah tabel ada di SQL Server


Saya ingin ini menjadi diskusi utama tentang bagaimana untuk memeriksa apakah ada meja di SQL Server 2000/2005 menggunakan Pernyataan SQL.

Ketika Anda Google untuk jawabannya, Anda mendapatkan begitu banyak jawaban yang berbeda. Apakah ada cara yang kompatibel / mundur dan maju untuk melakukannya?

Berikut dua cara yang mungkin untuk melakukannya. Yang mana di antara keduanya adalah standar / cara 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 sesuatu yang serupa.


878
2017-10-03 16:00


asal


Jawaban:


Untuk pertanyaan seperti ini, sebaiknya selalu menggunakan INFORMATION_SCHEMA melihat. Pandangan ini (kebanyakan) standar di banyak basis data berbeda dan jarang berubah dari satu versi ke versi lainnya.

Untuk memeriksa apakah ada meja yang digunakan:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

1062
2017-10-03 16:17



Perhatikan juga bahwa jika karena alasan apa pun Anda perlu memeriksa tabel sementara, Anda dapat melakukan ini:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

225
2018-01-28 14:50



Kami selalu menggunakan OBJECT_ID gaya selama yang saya ingat

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 

180
2017-10-03 16:05



Silakan lihat pendekatan di bawah ini,

Pendekatan 1: Menggunakan tampilan INFORMATION_SCHEMA.TABLES

Kita dapat menulis permintaan seperti di bawah ini untuk memeriksa apakah Tabel Pelanggan ada dalam database saat ini.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

Pendekatan 2: Menggunakan fungsi OBJECT_ID ()

Kita dapat menggunakan fungsi OBJECT_ID () seperti di bawah ini untuk memeriksa apakah Tabel Pelanggan ada dalam database saat ini.

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

Pendekatan 3: Menggunakan Tampilan Katalog sys.Objects

Kita dapat menggunakan tampilan katalog Sys.Objects untuk memeriksa keberadaan Tabel seperti yang ditunjukkan di bawah ini:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

Pendekatan 4: Menggunakan tampilan Katalog sys.Tables

Kita dapat menggunakan tampilan katalog Sys.Tables untuk memeriksa keberadaan Tabel seperti yang ditunjukkan di bawah ini:

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

Pendekatan 5: Hindari Menggunakan sys.sysobjects System table

Kita harus menghindari menggunakan Sistem Tabel sys.sysobjects secara langsung, akses langsung ke itu akan ditinggalkan dalam beberapa versi Sql Server yang akan datang. Seperti pada tautan Microsoft BOL, Microsoft menyarankan untuk menggunakan tampilan katalog sys.objects / sys.tables daripada sistem sys.sysobjects secara langsung.

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

dirujuk dari: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/


85
2017-12-22 12:01



Mencari meja di database yang berbeda:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

28
2018-03-15 17:19



IF OBJECT_ID('mytablename') IS NOT NULL 

19
2017-11-22 09:59



Hanya ingin menyebutkan satu situasi di mana mungkin akan sedikit lebih mudah untuk menggunakan OBJECT_ID metode. Itu INFORMATION_SCHEMA pandangan adalah objek di bawah setiap database-

Pandangan skema informasi didefinisikan dalam skema khusus bernama   INFORMATION_SCHEMA. Skema ini terdapat di setiap basis data.

https://msdn.microsoft.com/en-us/library/ms186778.aspx

Oleh karena itu semua tabel yang Anda akses menggunakan

IF EXISTS (SELECT 1 
           FROM [database].INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

hanya akan mencerminkan apa yang ada di dalamnya [database]. Jika Anda ingin memeriksa apakah tabel di lain database ada, tanpa mengubah secara dinamis [database] setiap kali, OBJECT_ID akan membiarkan Anda melakukan ini di luar kotak. Ex-

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

bekerja dengan baik

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL SERVER 2016 Edit:

Mulai tahun 2016, Microsoft menyederhanakan kemampuan untuk memeriksa objek yang tidak ada sebelum menjatuhkan, dengan menambahkan if exists kata kunci ke droppernyataan. Sebagai contoh,

drop table if exists mytablename

akan melakukan hal yang sama 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/


18
2018-06-22 17:18



Menggunakan Skema Informasi adalah cara SQL Standard untuk melakukannya, sehingga harus digunakan oleh semua database yang mendukungnya.


17
2017-10-03 16:03



IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

Di sini, di kode di atas, nama tabel adalah Mapping_APCToFANavigator.


10
2018-04-07 10:39



Jika Anda perlu bekerja pada database yang berbeda:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END

8
2017-10-21 14:58



Saya tahu ini adalah pertanyaan lama tetapi saya telah menemukan kemungkinan ini jika Anda berencana untuk sering menelepon.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

8
2018-01-21 15:37