Periksa apakah tabel ada di SQL Server

1143

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.

Vincent
sumber
1
Mengapa lebih baik menggunakan INFORMATION_SCHEMA.TABLES daripada sys.tables lalu memfilter dengan nama apa saja, mungkin menambahkan cek nilai type_desc?
DanteTheSmith

Jawaban:

1332

Untuk kueri seperti ini, selalu lebih baik menggunakan INFORMATION_SCHEMAtampilan. 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
akmad
sumber
12
Bagus sekali! Namun, dalam T-SQL (sebagai tanggapan terhadap poster asli), ini TABLE_SCHEMA, bukan SCHEMA_NAME. Terima kasih atas tipnya.
Nicholas Piasecki
10
Mengingat bahwa nama objek saja (yaitu, tanpa skema) tidak dijamin unik, tidak ada 100% cara yang aman untuk melakukan ini. Jika Anda bekerja dengan DB yang tidak memiliki konflik penamaan di seluruh skema, maka cukup hapus "TABLE_SCHEMA = 'TheSchema'" akan bekerja dengan baik.
akmad
26
Untuk memeriksa tabel sementara, kita harus query database tempdb dan menggunakan operator LIKE untuk nama tabelSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pierre-Alain Vigeant
4
Respons di bawah ini yang menggunakan fungsi OBJECT_ID tidak beroperasi dengan benar mengenai tabel temp per koneksi - stackoverflow.com/a/2155299/16147
Rich Rousseau
4
@akmad SQL compiler query akan memeriksa tabel sebelum menjalankan query dan akan gagal bahkan sebelum memulai.
Marc K
278

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
James Bloomer
sumber
10
Menggunakan metode ini tampaknya menghormati sifat per koneksi tabel temp. Permintaan INFORMATION_SCHEMA yang diposting sebelumnya akan mengembalikan baris terlepas dari koneksi yang membuat tabel.
Rich Rousseau
238

Kami selalu menggunakan OBJECT_IDgaya selama saya ingat

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 
Bob King
sumber
16
Saya percaya ini akan cepat, meskipun tidak terlalu portabel. Tampilan skema informasi dijamin ada pada DBRMS yang mendukung standar. Selain itu, OBJECT_ID biasa tidak menjamin objek adalah tabel.
Joe Pineda
9
Terima kasih Joe, saya bertanya-tanya mengapa Anda akan menggunakan OBJECT_ID vs INFORMATION_SCHEMA.TABLES vs sys.tables. Menunjukkan bahwa INFORMATION_SCHEMA adalah bagian dari standar yang cukup banyak menjawab pertanyaan itu. BTW itu lucu, salah satu pakar Database kami yang akan saya ajukan pertanyaan ini memiliki nama belakang yang sama dengan Anda, harus menjadi nama belakang yang baik untuk database.
Apeiron
24
@ JoPineda: Maka Anda gunakan kasus OBJECT_ID('TableName', 'U')untuk menjamin objek adalah tabel.
Allon Guralnek
1
@ AllonGuralnek demikian, alih-alih mengikuti standar yang sederhana dan portabel, tambahkan info cryptic tambahan?
mendefinisikan
22
@DustinFineout: Pertanyaan itu diberi tag tsql , jadi portabilitas tidak berlaku terlalu banyak. Secara umum saya telah menemukan sangat sedikit basis kode yang benar-benar portabel dan jika ringkas dinilai maka pasti mengalahkan penulisan IF EXISTSkueri dari jawaban yang diterima berulang-ulang. Plus, semuanya samar sampai Anda membaca dokumentasi, terutama di T-SQL (atau varian lainnya, benar-benar).
Allon Guralnek
132

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

  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/

BrainCoder
sumber
37

Mencari tabel di database yang berbeda:

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

Hanya ingin menyebutkan satu situasi di mana mungkin akan sedikit lebih mudah untuk menggunakan OBJECT_IDmetode ini. The INFORMATION_SCHEMApandangan benda bawah masing-masing database-

Tampilan skema informasi didefinisikan dalam skema khusus 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 di dalamnya [database]. Jika Anda ingin memeriksa apakah tabel di database lain ada, tanpa secara dinamis mengubah [database]setiap kali, OBJECT_IDakan 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 sama baiknya dengan

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

Sunting SQL SERVER 2016 :

Dimulai dengan 2016, Microsoft menyederhanakan kemampuan untuk memeriksa objek yang tidak ada sebelum dijatuhkan, dengan menambahkan if existskata kunci ke droppernyataan. Sebagai contoh,

drop table if exists mytablename

akan melakukan hal yang sama dengan OBJECT_ID/ INFORMATION_SCHEMApembungkus, dalam 1 baris kode.

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

iliketocode
sumber
25
IF OBJECT_ID('mytablename') IS NOT NULL 
sansalk
sumber
13

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

Vinko Vrsalovic
sumber
12
Ini seharusnya menjadi komentar.
underscore_d
3
Jawaban ini perlu diperbaiki.
rory.ap
11
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.

dilip kumar singh
sumber
2
Jika Anda memposting kode, XML, atau sampel data, harap sorot baris tersebut di editor teks dan klik tombol "kode sampel" ( { }) pada bilah alat editor untuk memformat dan sintaksis dengan baik!
marc_s
1
Perhatikan bahwa akses ke tabel sistem mungkin dihentikan di versi SQL Server yang akan datang. Gunakan tampilan Skema sebagai gantinya.
Olivier Jacot-Descombes
10

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
Bahkan Mien
sumber
1
Apakah kamu yakin Skema informasi pada kotak 2005 saya hanya mengembalikan katalog saat ini.
quillbreaker
8

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
dko
sumber
9
-1. Tidak ada gunanya memiliki prosedur untuk ini karena banyak kode untuk memanggil dan mengkonsumsi kembali hanya untuk melakukan pemilihan. Harus menggunakan sysnametipe data tidak varchar(50). Seharusnya tidak menggunakan sysobjectstampilan usang dan tidak memperhitungkan skema.
Martin Smith
6

Anda dapat menggunakan kode di bawah ini

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

Atau

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END
Reza Jenabi
sumber
5

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

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,@Z-@I)



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 
Marcello Miorelli
sumber
Ada banyak asumsi dalam skrip Anda. Misalnya, saya dapat dengan mudah membuat tabel bernama 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_NAMEkolom Anda didefinisikan sebagai sysname', yet you try to squeeze 2 kolom sysname` dan sebuah titik ( .), semuanya dikelilingi tanda kurung siku di sana ... bahwa suatu hari pasti akan gagal!
deroby
@deroby Saya setuju sysname bukan tipe data terbaik untuk digunakan, namun skrip telah berjalan untuk waktu yang lama tanpa kesalahan, saya akan menghabiskan waktu hanya jika saya menemukan situasi yang masuk akal di mana itu tidak berfungsi. Bahkan lebih baik, Anda mengambil kode ini, memperbaikinya dan mempostingnya di sini sebagai jawaban dan saya akan mengujinya, jika berhasil saya akan mengubah jawaban Anda.
Marcello Miorelli
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
dipi evil
sumber
3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
Moccassin
sumber
2

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

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

phil294
sumber
4
-1 karena OP justru meminta solusi SQL Server untuk masalah, bukan yang MySQL. Dia menulis tentang MySQL karena dia tahu solusi pada DBMS itu dan dia menginginkan hasil yang sama pada SQL Server. Juga jawaban Anda bahkan bukan permintaan MySQL, tetapi kode PHP yang berfungsi dengan MySQL.
mordack550
1
@ mordack550, saya setuju dengan Blauhirn. Dia benar. Ini adalah hit teratas di Google untuk mencari tahu apakah ada tabel di SQL. Niatnya baik dan informasinya sangat membantu. +1
Markus
Sangat disayangkan bahwa Microsoft memiliki kebiasaan mencoba merangkul / Memperpanjang / Memadamkan standar dan pola umum seperti SQL. Saya benar-benar berharap mereka telah memberikan implementasi mereka dari SQL server nama yang tepat sehingga orang dapat mengidentifikasi referensi khusus untuk produk mereka secara jelas.
psaxton
2
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
Krishnaraj Barvathaya
sumber
2

Anda bisa menggunakan ini:

     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
BTE
sumber
1
select name from SysObjects where xType='U' and name like '%xxx%' order by name
MarceloMadnezz
sumber
1

- - 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);
Mathieu Dierckx
sumber
1
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and 
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted

BEGIN
--TABLE EXISTS
END

ELSE BEGIN
--TABLE DOES NOT EXISTS
END
Mohamad Reza Shahrestani
sumber
1

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

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

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

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL
Kelum Sampath Edirisinghe
sumber
0

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 adalah a

Maslow
sumber
0

Jika ini adalah diskusi 'utama', maka harus 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'
pengguna3651072
sumber
Mungkin lebih cocok untuk menambahkan ini sebagai komentar untuk jawaban Leonard atau mungkin sebagai edit?
EWit
0

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:

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..
}
Michael Quad
sumber
Gagal dengan keluaran apa?
wscourge
@wscourge, kueri SQL gagal atau sejenisnya. Saya baru saja memeriksa nilai kembali dari fungsi pelaksana.
Michael Quad
Tambahkan ke jawaban Anda
wscourge
0

Ada satu opsi lagi untuk memeriksa apakah tabel ada di seluruh database

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END
Jitan Gupta
sumber
-1

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';
S Krishna
sumber
-6

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

memanggil
sumber
Dalam SSMS 2012, ia tidak lagi melakukan pemeriksaan if-exist, jika pernah melakukannya (saya tidak ingat bagaimana versi sebelumnya menghasilkan skrip di atas). Mungkin Anda salah dengan cara alat db lain adalah scripting objek tabel?
Ivaylo Slavov
SSMS akan melakukan pemeriksaan jika ada jika Anda memintanya. Alat> Opsi> SQL Server Object Explorer> Scripting> "Opsi scripting objek": "Periksa keberadaan objek" = True
Seann Alexander