1311

これが、SQL ステートメントを使用して SQL Server 2000/2005 にテーブルが存在するかどうかを確認する方法に関する究極の議論であることを望みます。

答えをグーグルで検索すると、非常に多くの異なる答えが得られます。それを行う公式/後方および前方互換性のある方法はありますか?

これを行うには、2 つの方法があります。2つのうち、標準/最良の方法はどれですか?

最初の方法:

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;

2 番目の方法:

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

MySQLはシンプルな

SHOW TABLES LIKE '%tablename%'; 

声明。私は似たようなものを探しています。

4

29 に答える 29

1508

このようなクエリでは、常にINFORMATION_SCHEMAビューを使用するのが最善です。これらのビューは、多くの異なるデータベースで (ほとんど) 標準であり、バージョンごとに変更されることはめったにありません。

テーブルが存在するかどうかを確認するには、次を使用します。

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END
于 2008-10-03T16:17:35.343 に答える
323

また、何らかの理由で一時テーブルを確認する必要がある場合は、次のように実行できます。

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists
于 2010-01-28T14:50:03.297 に答える
279

OBJECT_ID私が覚えている限り、私たちはいつもそのスタイルを使用しています

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 
于 2008-10-03T16:05:16.727 に答える
167

以下のアプローチを参照してください。

アプローチ 1: INFORMATION_SCHEMA.TABLES ビューを使用する

次のようなクエリを記述して、現在のデータベースに Customers テーブルが存在するかどうかを確認できます。

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

アプローチ 2: OBJECT_ID() 関数を使用する

以下のような OBJECT_ID() 関数を使用して、現在のデータベースに Customers テーブルが存在するかどうかを確認できます。

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

アプローチ 3: sys.Objects カタログ ビューを使用する

以下に示すように、Sys.Objects カタログ ビューを使用して、テーブルの存在を確認できます。

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

アプローチ 4: sys.Tables カタログ ビューを使用する

以下に示すように、Sys.Tables カタログ ビューを使用して、テーブルの存在を確認できます。

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

アプローチ 5: sys.sysobjects システム テーブルの使用を避ける

sys.sysobjects システム テーブルを直接使用することは避ける必要があります。これへの直接アクセスは、Sql Server の将来のバージョンで廃止される予定です。Microsoft BOL リンクによると、Microsoft は、sys.sysobjects システム テーブルを直接使用する代わりに、カタログ ビュー sys.objects/sys.tables を使用することを提案しています。

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

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

于 2014-12-22T12:01:58.050 に答える
38

別のデータベースでテーブルを探す:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
于 2012-03-15T17:19:42.577 に答える
31
IF OBJECT_ID('mytablename') IS NOT NULL 
于 2013-11-22T09:59:29.997 に答える
12

情報スキーマの使用は SQL 標準の方法であるため、それをサポートするすべてのデータベースで使用する必要があります。

于 2008-10-03T16:03:54.777 に答える
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

上記のコードでは、テーブル名はMapping_APCToFANavigator.

于 2011-04-07T10:39:34.297 に答える
10

異なるデータベースで作業する必要がある場合:

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
于 2009-10-21T14:58:15.393 に答える
8

古い質問であることは承知していますが、頻繁に電話する予定がある場合は、この可能性を見つけました。

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
于 2011-01-21T15:37:37.120 に答える
5

開発者と仲間の DBA の利益のために、ここに追加するだけです

@Tablename をパラメーターとして受け取るスクリプト

(スキーマ名が含まれる場合と含まれない場合があります) で、schema.table が存在する場合は以下の情報を返します。

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

テーブルまたはビューが存在するかどうかをテストする必要があるたびに、他のスクリプト内で使用するためにこのスクリプトを作成し、存在する場合は、その object_id を他の目的に使用するために取得します。

空の文字列、間違ったスキーマ名、または間違ったテーブル名を渡した場合、エラーが発生します。

これはプロシージャ内にあり、たとえば -1 を返す可能性があります。

例として、データ ウェアハウス データベースの 1 つに "Facts.FactBackOrder" というテーブルがあります。

これが私がこれを達成した方法です:

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 
于 2015-01-23T17:40:57.443 に答える
4
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
于 2013-10-24T11:04:32.467 に答える
3

まだ解決策を見つけていない人のために知っておくべき重要なこと: SQL server != MYSQL . MYSQLでやりたい場合は、非常に簡単です

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

これは Google でトップ ヒットであるため、ここに投稿します。

于 2014-07-23T13:55:00.187 に答える
2

これを使用できます:

     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
于 2014-11-18T14:36:47.300 に答える
0
select name from SysObjects where xType='U' and name like '%xxx%' order by name
于 2014-02-10T18:54:51.620 に答える
-1

これが「究極の」議論である場合、サーバーがリンクされている場合、Larry Leonard のスクリプトはリモート サーバーにもクエリを実行できることに注意してください。

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
于 2014-08-18T22:08:21.883 に答える