it-swarm.asia

Periksa apakah tabel ada di SQL Server

Saya ingin ini menjadi pembahasan 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.

985
Vincent

Untuk pertanyaan seperti ini, selalu lebih baik menggunakan tampilan INFORMATION_SCHEMA. Pandangan ini (kebanyakan) standar di banyak basis data yang berbeda dan jarang berubah dari versi ke versi.

Untuk memeriksa apakah ada tabel, gunakan:

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

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
249
James Bloomer

Kami selalu menggunakan gaya OBJECT_ID selama yang saya ingat

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

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.

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

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.

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

Pendekatan 3: Menggunakan sys.Objects Catalog View

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 sys.Tables Catalogue View

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 Tabel sistem

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 dilihat sys.objects/sys.tables, bukan tabel 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/

107
BrainCoder

Mencari tabel di database yang berbeda:

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

Hanya ingin menyebutkan satu situasi di mana mungkin akan sedikit lebih mudah untuk menggunakan metode OBJECT_ID. Pandangan INFORMATION_SCHEMA adalah objek di bawah setiap basis data-

Tampilan skema informasi didefinisikan dalam skema khusus yang bernama INFORMATION_SCHEMA. Skema ini terkandung dalam setiap basis data.

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

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 dalam [database]. Jika Anda ingin memeriksa apakah tabel dalam database lain ada, tanpa secara dinamis mengubah [database] setiap kali, OBJECT_ID akan memungkinkan 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 sama baiknya dengan

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

Edit SQL SERVER 2016 :

Dimulai dengan 2016, Microsoft menyederhanakan kemampuan untuk memeriksa objek yang tidak ada sebelum dijatuhkan, dengan menambahkan kata kunci if exists ke pernyataan drop. Sebagai contoh,

drop table if exists mytablename

akan melakukan hal yang sama seperti pembungkus OBJECT_ID/INFORMATION_SCHEMA, dalam 1 baris kode.

https://blogs.msdn.Microsoft.com/sqlserverstorageengine/2015/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

22
iliketocode
IF OBJECT_ID('mytablename') IS NOT NULL 
20
sansalk

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

15
Vinko Vrsalovic

Jika Anda perlu bekerja pada basis data 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
10
Even Mien
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, dalam kode di atas, nama tabelnya adalah Mapping_APCToFANavigator.

10

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

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

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:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

Saya menghasilkan 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 menimbulkan kesalahan ketika Anda melewati 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:

PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME() 
PRINT ''
GO

SET NOCOUNT ON
GO

--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================

DECLARE @TableName SYSNAME

SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT 

SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)

IF (@Z = 0) BEGIN

            RAISERROR('Invalid @Tablename passed.',16,1)

END 

SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I

IF @I > 0 BEGIN

        --===================================================================================
        -- a schema and table name have been passed
        -- example Facts.FactBackOrder 
        -- @Schema = Fact
        -- @TableName = FactBackOrder
        --===================================================================================

   SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)
   SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@[email protected])



END
ELSE BEGIN

        --===================================================================================
        -- just a table name have been passed
        -- so the schema will be dbo
        -- example Orders
        -- @Schema = dbo
        -- @TableName = Orders
        --===================================================================================

   SELECT @Schema    = 'DBO'     


END

        --===================================================================================
        -- Check whether the @SchemaName is valid in the current database
        --===================================================================================

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN

            RAISERROR('Invalid Schema Name.',16,1)

END 

--SELECT @Schema  as [@Schema]
--      ,@TableName as [@TableName]


DECLARE @R1 TABLE (

   THE_NAME SYSNAME
  ,THE_SCHEMA SYSNAME
  ,THE_TABLE SYSNAME
  ,OBJECT_ID INT
  ,THE_TYPE SYSNAME
  ,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)

)

;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
      ,the_schema=SCHEMA_NAME(O.schema_id)
      ,the_table=O.NAME
      ,object_id =o.object_id 
      ,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END 
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
   THE_NAME 
  ,THE_SCHEMA 
  ,THE_TABLE 
  ,OBJECT_ID
  ,THE_TYPE 
)
SELECT  the_name
       ,the_schema
       ,the_table
       ,object_id
       ,the_type
FROM RADHE_01
WHERE the_schema = @Schema 
  AND the_table  = @TableName

IF (@@ROWCOUNT = 0) BEGIN 

             RAISERROR('Invalid Table Name.',16,1)

END 
ELSE BEGIN

    SELECT     THE_NAME 
              ,THE_SCHEMA 
              ,THE_TABLE 
              ,OBJECT_ID
              ,THE_TYPE 

    FROM @R1

END 
5

Di SQL Server 2000 Anda dapat mencoba:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
4
dipi evil
    IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL 
      BEGIN 
          print 'deleted table';
          drop table t 
      END
    else 
      begin 
          print 'table not found' 
      end

Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
insert into t( name, lastname) values('john','doe');
insert into t( name, lastname) values('rose',NULL);

Select * from t
1   john    doe
2   rose    NULL

-- clean
drop table t
3
BTE
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
3
Moccassin

Sesuatu yang penting untuk diketahui bagi siapa saja yang belum menemukan solusi mereka: SQL server! = MYSQL . Jika Anda ingin melakukannya denganMYSQL, itu cukup sederhana

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
    $result = mysql_query($sql);
    if( $result == false )
        echo "table DOES NOT EXIST";
    else
        echo "table exists";

Posting ini di sini karena ini adalah hit teratas di Google.

2
Blauhirn
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO
1
select name from SysObjects where xType='U' and name like '%xxx%' order by name
1
MarceloMadnezz

- - buat prosedur untuk memeriksa apakah ada tabel


DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

- - cara menggunakan: periksa apakah migrasi tabel ada


 CALL checkIfTableExists('muDbName', 'migrations', @output);
0
Mathieu Dierckx

Jika ini adalah diskusi 'utama', maka perlu dicatat bahwa skrip Larry Leonard dapat meminta server jarak jauh juga jika server terhubung.

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

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:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

mengingat bahwa Anda memiliki objek dengan nama di properti yang disebut item, dan skema di properti yang disebut skema di mana nama variabel sumber a

0
Maslow

Saya mempunyai beberapa masalah dengan memilih dari INFORMATIONAL_SCHEME dan OBJECT_ID. Saya tidak tahu apakah ini masalah driverODBC atau sesuatu .. Permintaan dari studio manajemen SQL, keduanya, baik-baik saja.

Ini solusinya:

SELECT COUNT(*) FROM <yourTableNameHere>

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 ..

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
0
Michael Quad

Jalankan kueri ini untuk memeriksa apakah tabel ada di database:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
0
S Krishna