sql >> データベース >  >> RDS >> Sqlserver

SQL Serverにテーブルが存在するかどうかを確認する6つの方法(T-SQLの例)

    この記事では、SQLServerにテーブルが存在するかどうかを確認するための5つのオプションを提供します。ほとんどのオプションにはシステムビューのクエリが含まれますが、オプションの1つはシステムストアドプロシージャを実行し、もう1つは関数を含みます。

    簡単なIFもいくつか含めます 状況に合わせて変更できるステートメント。

    オプション1-sys.tablesビュー

    このオプションは、sys.tablesにクエリを実行します システムカタログビュー。このビューは、各ユーザーテーブルの行を返します。したがって、チェックしているテーブル名を使用してクエリを実行できます。

    例:

    SELECT 
      object_id 
    FROM sys.tables
    WHERE name = 'Artists';
    

    結果:

    +-------------+
    | object_id   |
    |-------------|
    | 885578193   |
    +-------------+
    

    チェックするものにスキーマ名を追加することもできます。前のクエリを変更してスキーマ名を含める方法は次のとおりです。

    SELECT
      object_id  
    FROM sys.tables
    WHERE name = 'Artists'
    AND SCHEMA_NAME(schema_id) = 'dbo';
    

    結果:

    +-------------+
    | object_id   |
    |-------------|
    | 885578193   |
    +-------------+
    

    sys.tablesに注意してください viewはスキーマIDのみを返すため、それをSCHEMA_NAME()に渡す必要がありました。 その名前を取得するための関数。または、スキーマIDを知っていれば、それを使用することもできます。

    例:

    SELECT
      object_id  
    FROM sys.tables
    WHERE name = 'Artists'
    AND schema_id = 1;
    

    結果:

    +-------------+
    | object_id   |
    |-------------|
    | 885578193   |
    +-------------+
    

    オプション2–sp_tablesストアドプロシージャ

    次のオプションは、sp_tablesを実行します ストアドプロシージャ。

    この方法を使用すると、コードがどれほど簡潔になるかを次に示します。

    sp_tables 'Artists'
    

    結果:

    +-------------------+---------------+--------------+--------------+-----------+
    | TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
    |-------------------+---------------+--------------+--------------+-----------|
    | Music             | dbo           | Artists      | TABLE        | NULL      |
    +-------------------+---------------+--------------+--------------+-----------+
    

    ただし、このストアドプロシージャはテーブルだけでなくビューも返すため、テーブルだけに絞り込むことをお勧めします(ビューを返すことに関心がある場合を除く)。テーブルだけに絞り込むには、@table_type = "'TABLE'"を使用します 。

    その間、テーブルの所有者とテーブルの修飾子を指定することもできます。

    例:

    EXEC sp_tables 
      @table_name = 'Artists',  
      @table_owner = 'dbo',
      @table_qualifier = 'Music',
      @table_type = "'TABLE'",
      @fUsePattern = 1;
    

    結果:

    +-------------------+---------------+--------------+--------------+-----------+
    | TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | TABLE_TYPE   | REMARKS   |
    |-------------------+---------------+--------------+--------------+-----------|
    | Music             | dbo           | Artists      | TABLE        | NULL      |
    +-------------------+---------------+--------------+--------------+-----------+
    

    @table_typeに注意することが重要です パラメーターは、コンマ区切りのリストを受け入れます。したがって、他のパラメータとは少し異なります。 @table_type 値は二重引用符で囲み、各項目は一重引用符で囲む必要があります。私の例では、リストアイテムは1つだけですが、それでも二重引用符と一重引用符の両方で囲む必要があります。

    オプション3– INFORMATION_SCHEMA.TABLES

    INFORMATION_SCHEMA.TABLES システムビューは、現在のユーザーがアクセス許可を持っている現在のデータベースのテーブルまたはビューごとに1行を返します。 sys.tablesに似ています 、ただし、返される列は少なくなります。 SQL Serverに含まれる情報スキーマビューは、INFORMATION_SCHEMAのISO標準定義に準拠しています。

    これを使用して、現在のデータベースにテーブルが存在するかどうかを確認する例を次に示します。

    SELECT * 
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME = 'Artists';
    

    結果:

    +-----------------+----------------+--------------+--------------+
    | TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | TABLE_TYPE   |
    |-----------------+----------------+--------------+--------------|
    | Music           | dbo            | Artists      | BASE TABLE   |
    +-----------------+----------------+--------------+--------------+
    

    ここでも同じですが、今回はスキーマも指定します:

    SELECT * 
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME = 'Artists'
    AND TABLE_SCHEMA = 'dbo';
    

    結果:

    +-----------------+----------------+--------------+--------------+
    | TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | TABLE_TYPE   |
    |-----------------+----------------+--------------+--------------|
    | Music           | dbo            | Artists      | BASE TABLE   |
    +-----------------+----------------+--------------+--------------+
    

    オプション4– OBJECT_ID()関数

    OBJECT_ID()などの関数を使用することもできます NULL以外の値を返すかどうかを確認します。

    例:

    SELECT OBJECT_ID('Artists', 'U') AS Result;
    

    結果:

    +-----------+
    | Result    |
    |-----------|
    | 885578193 |
    +-----------+
    

    この場合、テーブルは存在します。 Uを使用したことに注意してください オブジェクトタイプ(ユーザー定義テーブル)を示します。

    データベースとスキーマを含めるために、3つの部分からなる名前を指定することもできます。

    SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
    

    結果:

    +-----------+
    | Result    |
    |-----------|
    | 885578193 |
    +-----------+
    

    テーブルが存在しない場合は、NULLが表示されます :

    SELECT OBJECT_ID('Oops!', 'U') AS Result;
    

    結果:

    +----------+
    | Result   |
    |----------|
    | NULL     |
    +----------+
    

    IFでこれを使用する例については、以下を参照してください ステートメント。

    オプション5–sys.objectsビュー

    前の例のどれもうまくいかないかのように、テーブルが存在するかどうかを確認するさらに別の方法があります。

    今回はsys.objectsにクエリを実行します システムカタログビュー。このビューは、データベース内のユーザー定義のスキーマスコープのオブジェクトごとに行を返します。テーブルを返すだけでなく、あらゆる種類のオブジェクトを返します。したがって、テーブルだけに絞り込む必要があります。この場合、私はユーザー定義のテーブルにのみ関心があるので、type = 'U'を使用できます。 (U 「USER_TABLE」用です)。または、TYPE_DESC = 'USER_TABLE'を使用することもできます。 。

    SELECT 
      object_id 
    FROM sys.objects 
    WHERE type = 'U' 
    AND name = 'Artists';
    

    結果:

    +-------------+
    | object_id   |
    |-------------|
    | 885578193   |
    +-------------+
    

    ここでも、スキーマを指定しています:

    SELECT 
      object_id  
    FROM sys.objects 
    WHERE type = 'U' 
    AND name = 'Artists'
    AND SCHEMA_NAME(schema_id) = 'dbo';
    

    結果:

    +-------------+
    | object_id   |
    |-------------|
    | 885578193   |
    +-------------+
    

    オプション6– sys.sysobjectsビュー(AVOID)

    このオプションは、使用しないことをお勧めできるようにのみリストされています。 sys.sysobjects ビューは下位互換性のためにSQLServerに含まれているため、今後の作業ではこのビューを使用しないことをお勧めします。

    このビューを使用するコードに遭遇した場合は、sys.objectsを使用するように変更することを検討してください。 または他のシステムビューまたはストアドプロシージャ。

    いずれにせよ、sys.sysobjectsを使用した場合、前の例は次のようになります。 sys.objectsの代わりに 。

    SELECT
      id  
    FROM sys.sysobjects 
    WHERE xtype = 'U' 
    AND name = 'Artists';
    

    結果:

    +-----------+
    | id        |
    |-----------|
    | 885578193 |
    +-----------+
    

    IFステートメント1

    これが簡単なIFです テーブルの存在をチェックし、結果に応じて異なるメッセージを出力するステートメント。このコードは、特定のニーズに合わせて変更できます。

    IF EXISTS 
      (SELECT object_id FROM sys.tables
      WHERE name = 'Artists'
      AND SCHEMA_NAME(schema_id) = 'dbo')
      PRINT 'The table exists'
    ELSE 
      PRINT 'The table does not exist';
    

    結果:

    The table exists
    

    そして、テーブルが存在しない場合は次のようになります。

    IF EXISTS 
      (SELECT object_id FROM sys.tables
      WHERE name = 'Customer'
      AND SCHEMA_NAME(schema_id) = 'dbo')
      PRINT 'The table exists'
    ELSE 
      PRINT 'The table does not exist';
    

    結果:

    The table does not exist
    

    IFステートメント2

    別のIF 特定のニーズに合わせて変更できるステートメント。

    IF OBJECT_ID('Artists', 'U') IS NOT NULL  
      PRINT 'The table exists'
    ELSE 
      PRINT 'The table does not exist';
    

    結果:

    The table exists
    

    1. DBCC_OBJECT_METADATAラッチ

    2. MySQLのCONCATでGROUP_CONCATを使用する方法

    3. SQLワークロード分析はどのように役立ちますか?

    4. MySQLSELECTはnull値ではない