SQL Server'da tablonun mevcut olup olmadığını kontrol edin


1143

SQL Server 2000/2005 SQL tabloları kullanarak bir tablo olup olmadığını kontrol etmek nasıl nihai tartışma olmasını istiyorum.

Yanıt için Google olduğunuzda, çok farklı yanıtlar alırsınız. Bunu yapmanın resmi / geri ve ileri uyumlu bir yolu var mı?

İşte bunu yapmanın iki olası yolu. İkisinden hangisi bunu yapmanın standart / en iyi yoludur?

İlk yol:

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;

İkinci yol:

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL basit sağlar

SHOW TABLES LIKE '%tablename%'; 

Beyan. Benzer bir şey arıyorum.


1
Neden sys.tables yerine BİLGİ_SCHEMA.TABLES kullanmak ve sonra bir type_desc değer denetimi eklemek adıyla filtrelemek en iyisidir?
DanteTheSmith

Yanıtlar:


1332

Bunun gibi sorgular için bir INFORMATION_SCHEMAgörünüm kullanmak her zaman en iyisidir . Bu görünümler, birçok farklı veritabanında (çoğunlukla) standarttır ve nadiren sürümden sürüme değişir.

Bir tablonun olup olmadığını kontrol etmek için şunu kullanın:

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

12
Harika çalışıyor! T-SQL'de (orijinal postere yanıt olarak), SCHEMA_NAME değil TABLE_SCHEMA. Bahşiş için teşekkürler.
Nicholas Piasecki

10
Tek başına bir nesne adının (yani şema olmadan) benzersiz olduğu garanti edilmezse, bunu yapmanın% 100 güvenli bir yolu yoktur. Şemalar arasında adlandırma çakışması olmayan bir DB ile çalışıyorsanız, yalnızca "TABLE_SCHEMA = 'TheSchema'" öğesinin atlanması gayet iyi çalışır.
akmad

26
Geçici bir tablo olup olmadığını kontrol etmek için tempdb veritabanını sorgulamamız ve tablo adı için bir LIKE operatörü kullanmamız gerekirSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pierre-Alain Vigeant

4
OBJECT_ID işlevini kullanan aşağıdaki bir yanıt, bağlantı sıcaklığı tablolarına göre doğru şekilde çalışır - stackoverflow.com/a/2155299/16147
Rich Rousseau

4
@akmad SQL sorgu derleyicisi sorguyu çalıştırmadan önce tabloyu kontrol eder ve başlamadan önce başarısız olur.
Marc K

278

Ayrıca, herhangi bir nedenle geçici bir tablo kontrol etmeniz gerektiğinde şunları yapabileceğinizi unutmayın:

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

10
Bu yöntemi kullanmak, geçici tabloların bağlantı başına doğasına saygı duyuyor gibi görünüyor. Daha önce yayınlanan BİLGİ_SCHEMA sorgusu, tabloyu oluşturan bağlantıdan bağımsız olarak satırları döndürür.
Rich Rousseau

238

OBJECT_IDStili her zaman hatırladığım sürece kullanıyoruz

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

16
Çok hızlı olmasa da bunun hızlı olacağına inanıyorum. Standardı destekleyen tüm DBRMS'lerde bilgi şeması görünümlerinin olması garanti edilir. Ayrıca, düz OBJECT_ID nesnenin bir tablo olduğunu garanti etmez.
Joe Pineda

9
Teşekkürler Joe, neden OBJECT_ID vs BİLGİ_SCHEMA.TABLES vs sys.tables kullanacağınızı merak ediyordum. BİLGİ_SCHEMA'nın bu soruyu hemen hemen cevaplayan bir standardın parçası olduğuna dikkat edin. BTW çok komik, bu soruyu soracağım Veritabanı uzmanlarımızdan biri, veritabanları için iyi bir soyadı olmalı.
Apeiron

24
@JoePineda: Sonra OBJECT_ID('TableName', 'U')nesnenin bir tablo olduğunu garanti etmek için kullanın .
Allon Güralnek

1
@AllonGuralnek, basit ve taşınabilir bir standardı takip etmek yerine, ekstra bir parça şifreli bilgi mi ekliyorsunuz?
tanımlar

22
@DustinFineout: Soru tsql olarak etiketlendi , bu nedenle taşınabilirlik o kadar geçerli değil. Genel olarak çok az gerçekten taşınabilir kod tabanları ile karşılaştım ve özlüğe değer verilirse, o zaman bu IF EXISTSsorguyu kabul edilen cevaptan defalarca yazmayı kesinlikle yener . Ayrıca, özellikle T-SQL'de (veya başka herhangi bir varyantta) belgeleri okuyana kadar her şey şifreli.
Allon Güralnek

132

Lütfen aşağıdaki yaklaşımlara bakın,

Yaklaşım 1: BİLGİ_SCHEMA.TABLES görünümünü kullanma

Mevcut veritabanında bir Müşteriler Tablosu olup olmadığını kontrol etmek için aşağıdaki gibi bir sorgu yazabiliriz.

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

Yaklaşım 2: OBJECT_ID () işlevini kullanma

Mevcut veritabanında bir Müşteriler Tablosu olup olmadığını kontrol etmek için OBJECT_ID () işlevini aşağıdaki gibi kullanabiliriz.

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

Yaklaşım 3: sys.Objects Katalog Görünümünü Kullanma

Tablonun varlığını aşağıda gösterildiği gibi kontrol etmek için Sys.Objects katalog görünümünü kullanabiliriz:

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

Yaklaşım 4: sys.Tables Katalog Görünümünü Kullanma

Tablonun varlığını aşağıda gösterildiği gibi kontrol etmek için Sys.Tables katalog görünümünü kullanabiliriz:

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

Yaklaşım 5: sys.sysobjects Sistem tablosunu kullanmaktan kaçının

Sys.sysobjects Sistem Tablosunu doğrudan kullanmaktan kaçınmalıyız, doğrudan erişim Sql Server'ın bazı gelecek sürümlerinde kullanımdan kaldırılacaktır. Microsoft BOL bağlantısına göre, Microsoft doğrudan sys.sysobjects sistem tablosu yerine sys.objects / sys.tables katalog görünümlerini kullanmanızı önerir.

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

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


37

Farklı bir veritabanında tablo arama:

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

26

Sadece OBJECT_IDyöntemi kullanmanın biraz daha kolay olacağı bir durumdan bahsetmek istedim . INFORMATION_SCHEMAGösterim her veritabanı-altında nesnelerdir

Bilgi şeması görünümleri BİLGİ_SCHEMA adlı özel bir şemada tanımlanır. Bu şema her veritabanında bulunur.

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

Bu nedenle kullanarak eriştiğiniz tüm tablolar

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;

sadece içinde ne olduğunu yansıtır [database]. Başka bir veritabanındaki tabloların [database]her seferinde dinamik olarak değişmeden var olup olmadığını kontrol etmek isterseniz , OBJECT_IDbunu kutunun dışında yapmanıza izin verecektir. eski

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

olduğu gibi çalışıyor

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

SQL SERVER 2016 Düzenle :

Microsoft 2016'dan başlayarak, ifadelere if existsanahtar kelimeler ekleyerek, bırakmadan önce var olmayan nesneleri kontrol etme yeteneğini basitleştirdi drop. Örneğin,

drop table if exists mytablename

OBJECT_ID/ INFORMATION_SCHEMAwrappers ile aynı şeyi 1 kod satırında yapacak .

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



13

Bilgi Şemasını kullanmak, bunu yapmak için SQL Standard yoludur, bu nedenle onu destekleyen tüm veritabanları tarafından kullanılmalıdır.


12
Bu bir yorum olmalıydı.
underscore_d

3
Bu cevabın iyileştirilmesi gerekiyor.
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

Yukarıdaki kodda, tablo adı Mapping_APCToFANavigator.


2
Kod, XML veya veri örnekleri gönderiyorsanız, lütfen metin düzenleyicide bu satırları vurgulayın ve { }güzel biçimlendirmek ve sözdizimi vurgulamak için düzenleyici araç çubuğundaki "kod örnekleri" düğmesini ( ) tıklayın !
marc_s

1
SQL Server'ın gelecekteki sürümünde sistem tablolarına erişimin kesilebileceğini unutmayın. Bunun yerine Şema görünümlerini kullanın.
Olivier Jacot-Descombes

10

Farklı veritabanlarında çalışmanız gerekiyorsa:

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

1
Emin misiniz? 2005 kutumdaki bilgi şeması yalnızca geçerli kataloğu döndürüyor.
quillbreaker

8

Eski bir soru olduğunu biliyorum ama sık sık aramayı planlıyorsanız bu olasılığı buldum.

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

9
-1. Bunun için bir prosedürün olması anlamsızdır, çünkü sadece seçimi yapmak için çağrı yapmak ve geri dönüşü tüketmek için çok fazla kod vardır. Kullanmalı mıyım sysnameveri türü değil varchar(50). Kullanımdan kaldırılmış sysobjectsgörünüm kullanılmamalıdır ve şema dikkate alınmaz.
Martin Smith

6

Aşağıdaki kodu kullanabilirsiniz

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

Veya

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

5

Buraya, geliştiricilerin ve diğer DBA'ların yararına ekleyerek

parametre olarak @Tablename alan bir komut dosyası

(şema adını içerebilir veya içermeyebilir) ve schema.table varsa aşağıdaki bilgileri döndürür:

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

Bir tablo veya görünüm olup olmadığını sınamak istediğim her zaman diğer komut dosyalarının içinde kullanılmak üzere bu komut dosyası üretti ve bunu yaparken, object_id başka amaçlar için kullanılacak olsun.

Boş bir dize, yanlış şema adı veya yanlış tablo adı ilettiğinizde hata oluşur.

bu bir prosedür içinde olabilir ve örneğin -1 ile döner.

Örnek olarak, Veri Ambarı veritabanlarımdan birinde "Facts.FactBackOrder" adlı bir tablo var.

Bunu şu şekilde başardım:

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 

Senaryonuzda birçok varsayım var. Örneğin, kolayca adlandırılmış bir tablo craete dbo.[hello.world ]ve komut dosyası birden fazla nedenden dolayı bulamaz. Bununla birlikte, herkesin böyle bir tablo oluşturmak istemesi pek mümkün değil, ama yine de. Her neyse, THE_NAMEsütununuz sysname', yet you try to squeeze 2 sysname` sütunları ve bir nokta ( .) olarak tanımlanır , hepsi orada köşeli parantezlerle çevrilidir ... biri bir gün başarısızlığa mahkumdur!
deroby

@deroby Ben sysname kullanılacak en iyi veri türü değildir, ancak komut dosyası herhangi bir hata olmadan uzun bir süredir çalışıyor kabul ediyorum, sadece işe yaramazsa makul bir durum bulursam üzerinde zaman harcayacağım. Daha da iyisi, bu kodu alırsınız, geliştirir ve burada bir cevap olarak gönderirsiniz ve test edeceğim, eğer işe yararsa cevabınızı yükseltirim.
Marcello Miorelli

5

Gelen SQL Server 2000 deneyebilirsin:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END

3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

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

2

Henüz çözüm bulamayan herkes için bilmek önemli bir şey: SQL sunucusu! = MYSQL . MYSQL ile yapmak istiyorsanız , oldukça basit

    $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";

Bunu buraya gönderiyor çünkü Google'da en çok hit alan.


4
-1, çünkü OP tam olarak MySQL değil, soruna bir SQL Server çözümü istiyor. MySQL hakkında yazdı çünkü o DBMS'deki çözümü biliyordu ve SQL Server'da aynı sonucu istiyordu. Ayrıca cevabınız MySQL sorgusu bile değil, MySQL ile çalışan bir PHP kodudur.
mordack550

1
@ mordack550, Blauhirn'e katılıyorum. O haklı. Bu, SQL'de bir tablonun var olup olmadığını öğrenmek için Google'daki en büyük hit. Niyeti iyi ve bilgileri faydalı. +1
Mark

Microsoft'un SQL gibi ortak standartları ve kalıpları Kucaklama / Genişletme / Söndürme alışkanlığı olması talihsiz bir durumdur. İnsanların ürünlerine özgü referansları açık bir şekilde tanımlayabilmeleri için bir SQL sunucusu uygulamalarını uygun bir ad vermiş olmalarını dilerdim.
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

2

Bunu kullanabilirsiniz:

     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


1

- - tablonun mevcut olup olmadığını kontrol etmek için prosedür yaratın


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 ;

- - nasıl kullanılır: tablo geçişlerinin olup olmadığını kontrol edin


 CALL checkIfTableExists('muDbName', 'migrations', @output);

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

1

Burada örnek olarak bir görünüm oluşturma alarak .

Çünkü ALTER / CREATE komutları BEGIN / END blokları içinde olamaz. Bir yaratma yapmadan önce varlığını test etmeniz ve bırakmanız gerekir

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

GO

CREATE VIEW TestView
   as
   . . .

GO

Kayıp izinler konusunda endişeleriniz varsa, GRANT deyimlerini de yazabilir ve sonunda yeniden çalıştırabilirsiniz.

Oluşturma / değiştirme işlemini bir dizeye sarabilir ve bir EXEC yapabilirsiniz - bu, büyük görünümler için çirkinleşebilir

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

0

Herkes linq to sql (veya özellikle linqpad) de aynı şeyi yapmaya çalışıyorsa, sistem tablolarını ve görünümlerini dahil etme seçeneğini açın ve bu kodu yapın:

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

öğe adı verilen bir özellikte adı olan bir nesneniz ve kaynak değişkeni adının olduğu şema adı verilen bir özellikteki şemanız varsa a


0

Bu 'nihai' tartışma olacaksa, Larry Leonard'ın senaryosunun sunucular bağlıysa uzak bir sunucuyu da sorgulayabileceğine dikkat edilmelidir.

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

Belki de bunu Leonards cevabına yorum olarak veya belki de düzenleme olarak eklemek daha uygundur?
EWit

0

INFORMATIONAL_SCHEME ve OBJECT_ID arasından seçim yaparken bazı sorunlar yaşadım. ODBC sürücüsü veya başka bir sorun olup olmadığını bilmiyorum .. SQL yönetim stüdyosu sorguları, her ikisi de, iyiydi.

İşte çözüm:

SELECT COUNT(*) FROM <yourTableNameHere>

Bu nedenle, sorgu başarısız olursa, muhtemelen veritabanında böyle bir tablo yoktur (veya buna erişim izniniz yoktur).

Denetim, ODBC sürücüsü ile ilgilenen SQL yürütücüsü tarafından döndürülen değeri (benim durumumda tamsayı) karşılaştırarak yapılır.

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

Hangi çıktıda başarısız oluyor?
wscourge

@wscourge, SQL sorgusu başarısız veya benzeri bir şey. Ben sadece yürütme işlevinden dönüş değerini kontrol ediyorum.
Michael Quad

Cevabınıza ekleyin
wscourge

0

Tablonun veritabanlarında var olup olmadığını kontrol etmek için bir seçenek daha var

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

-1

Tablonun veritabanında olup olmadığını kontrol etmek için bu sorguyu çalıştırın:

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

-6

bir veritabanında t1 tablonuz olduğunu düşünün. komut dosyasını diğer Veritabanı üzerinde çalıştırmak istiyorsanız - t1 varsa t1 oluşturmak için başka bir şey yapmayın. Bu açık görsel stüdyosu yapmak ve aşağıdakileri yapmak için:

T1'e sağ tıklayın, Komut dosyası tablosu olarak, ardından DROP ve Şuraya Oluştur'a, ardından Yeni Sorgu Düzenleyicisi

istediğiniz sorguyu bulacaksınız. Ancak bu komut dosyasını çalıştırmadan önce sorguda drop deyimini yorumlamayı unutmayın, çünkü zaten bir tane varsa yeni bir tane oluşturmak istemezsiniz.

Teşekkürler


SSMS 2012'de, eğer varsa, artık varsa denetimi gerçekleştirmez (önceki sürümlerin yukarıdaki komut dosyasını nasıl oluşturduğunu hatırlamıyorum). Belki diğer db araçlarının komut dosyası tablo nesneleri komut dosyası ile yanlış mı?
Ivaylo Slavov

Varsa, varsa SSMS denetimi gerçekleştirir. Araçlar> Seçenekler> SQL Server Nesne Gezgini> Komut Dosyası Oluşturma> "Nesne komut dosyası oluşturma seçenekleri": "Nesne varlığını kontrol et" = Doğru
Seann Alexander
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.