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

SQL Serverの名前からオブジェクトのIDを取得します:OBJECT_ID()

    SQL Serverでは、OBJECT_ID()を使用できます 名前に基づいてオブジェクトのIDを返す関数。

    これは、オブジェクトのIDが必要であるが、その名前しかわからない場合に役立ちます。

    OBJECT_ID()の公式定義 スキーマスコープのオブジェクトのデータベースオブジェクト識別番号を返すということです。 。

    例1-基本的な使用法

    これがどのように機能するかを示す基本的な例です。

    SELECT OBJECT_ID('Artists') AS Result;
    

    結果:

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

    この場合、現在のデータベースにはAlbumsというオブジェクトが含まれています。 、およびそのIDは885578193です。これはobject_idにあるIDです。 sys.objectsの列 システムカタログビュー。

    例2–sys.objectsビューを確認する

    これが私が今言ったことを確認するためのもう1つの基本的な例です。

    SELECT 
      name,
      object_id,
      OBJECT_ID(name) AS [OBJECT_ID(name)]
    FROM sys.objects
    WHERE name = 'Artists';
    

    結果:

    +---------+-------------+-------------------+
    | name    | object_id   | OBJECT_ID(name)   |
    |---------+-------------+-------------------|
    | Artists | 885578193   | 885578193         |
    +---------+-------------+-------------------+
    
    >

    sys.objects システムカタログビューには、データベース内に作成されたユーザー定義のスキーマスコープオブジェクトごとの行が含まれています。

    この例では、最初の2列にオブジェクトのnameが表示されています およびobject_id それぞれ。

    この例の3番目の列では、OBJECT_ID()を使用しています。 名前に基づいてオブジェクトのIDを返します。これを行うには、名前列をOBJECT_ID()に渡します。 機能。

    これは明らかに単なる例であり、OBJECT_ID()を使用しています sys.objectsであるため、この場合は不要でした。 すでにオブジェクトのIDを返します。

    例3–より便利な例

    この例では、OBJECT_ID()を使用します WHERE Clientというテーブルに関連する結果のみを取得するように句を指定します 。

    SELECT
        OBJECT_NAME(referencing_id) AS [Referencing Entity],
        OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity],
        referencing_class_desc AS [Class],
        COL_NAME(referenced_id, referenced_minor_id) AS [Column]
    FROM sys.sql_expression_dependencies
    WHERE referenced_id = OBJECT_ID('Client');
    

    結果:

    +----------------------+----------------------------+------------------+------------+
    | Referencing Entity   | Referencing Minor Entity   | Class            | Column     |
    |----------------------+----------------------------+------------------+------------|
    | uspGetClient         | NULL                       | OBJECT_OR_COLUMN | NULL       |
    | uspGetOrdersByClient | NULL                       | OBJECT_OR_COLUMN | NULL       |
    | chkClientCode        | NULL                       | OBJECT_OR_COLUMN | ClientCode |
    +----------------------+----------------------------+------------------+------------+
    

    この場合、どのエンティティがClientに依存しているかを確認したいと思いました。 テーブル(つまり、SQLコードでそのテーブルを参照するエンティティ)。 referenced_id 列はオブジェクトのIDを使用するため、OBJECT_ID()を使用します 、ClientのIDを取得できました テーブルを作成し、referenced_idと比較します 。

    このクエリの詳細な説明と関連する例については、SQL Serverでの依存関係の検索:sql_expression_dependenciesを参照してください。

    例4–完全修飾名

    オブジェクト名をスキーマ名で修飾するオプションもあり、必要に応じてデータベース名も修飾することもできます。

    簡単な例を次に示します。

    SELECT 
      OBJECT_ID('Artists') AS [1 Part Name],
      OBJECT_ID('dbo.Artists') AS [2 Part Name],
      OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];
    

    結果:

    +---------------+---------------+---------------+
    | 1 Part Name   | 2 Part Name   | 3 Part Name   |
    |---------------+---------------+---------------|
    | 885578193     | 885578193     | 885578193     |
    +---------------+---------------+---------------+
    

    ここでも、今回は区切り文字として角かっこを使用しています:

    SELECT 
      OBJECT_ID('[Artists]') AS [1 Part Name],
      OBJECT_ID('[dbo].[Artists]') AS [2 Part Name],
      OBJECT_ID('[Music].[dbo].[Artists]') AS [3 Part Name];
    

    結果:

    +---------------+---------------+---------------+
    | 1 Part Name   | 2 Part Name   | 3 Part Name   |
    |---------------+---------------+---------------|
    | 885578193     | 885578193     | 885578193     |
    +---------------+---------------+---------------+
    

    同じ結果。

    オブジェクトが存在することがわかっていてもNULLの結果が得られる場合は、そのオブジェクトをスキーマ(およびデータベース名)で修飾してみてください。

    例5–データベース間のクエリ

    既定では、SQL Serverは、オブジェクト名が現在のデータベースのコンテキストにあると想定します。 3つの部分からなる名前を使用して、別のデータベース内のオブジェクトを指定できます。

    これは前の例と同じコードですが、今回はコードを2回実行します。最初は、Musicで実行します。 データベース、WideWorldImportersDWで2回目に実行 データベース:

    USE Music;
    SELECT 
      OBJECT_ID('Artists') AS [1 Part Name],
      OBJECT_ID('dbo.Artists') AS [2 Part Name],
      OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];
    
    USE WideWorldImportersDW;
    SELECT 
      OBJECT_ID('Artists') AS [1 Part Name],
      OBJECT_ID('dbo.Artists') AS [2 Part Name],
      OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];
    

    結果:

    Changed database context to 'Music'.
    +---------------+---------------+---------------+
    | 1 Part Name   | 2 Part Name   | 3 Part Name   |
    |---------------+---------------+---------------|
    | 885578193     | 885578193     | 885578193     |
    +---------------+---------------+---------------+
    (1 row affected)
    Changed database context to 'WideWorldImportersDW'.
    +---------------+---------------+---------------+
    | 1 Part Name   | 2 Part Name   | 3 Part Name   |
    |---------------+---------------+---------------|
    | NULL          | NULL          | 885578193     |
    +---------------+---------------+---------------+
    (1 row affected)
    

    最初の結果では、3つの列すべてが正しいIDを返します。これは、オブジェクトがたまたまMusicにあるためです。 データベース。

    2番目の結果では、3つのパーツ名のみが正しいオブジェクトを見つけることができます。 1つの部分と2つの部分の名前はデータベースの名前を指定しないため、これは予想されることです。したがって、オブジェクトはWideWorldImportersDWにあると想定されます。 (間違った)データベース。

    例6–オブジェクトタイプを指定する

    OBJECT_ID() 関数は、オブジェクトタイプの引数も受け入れます。この引数は、提供されている場合、オブジェクトの名前の後にあります。

    例:

    SELECT 
      OBJECT_ID('Artists', 'U') AS [Table];
    

    結果:

    +-----------+
    | Table     |
    |-----------|
    | 885578193 |
    +-----------+
    

    ここでは、オブジェクトタイプがUであることを指定します 、これは「テーブル(ユーザー定義)」を意味します。

    別のオブジェクトタイプを指定しようとすると、NULLが返されます :

    SELECT 
      OBJECT_ID('Artists', 'U') AS [Table],
      OBJECT_ID('Artists', 'V') AS [View],
      OBJECT_ID('Artists', 'P') AS [Stored Procedure];
    

    結果:

    +-----------+--------+--------------------+
    | Table     | View   | Stored Procedure   |
    |-----------+--------+--------------------|
    | 885578193 | NULL   | NULL               |
    +-----------+--------+--------------------+
    

    ここでも同じですが、代わりにビューの名前が付いています:

    SELECT 
      OBJECT_ID('RockAlbums', 'U') AS [Table],
      OBJECT_ID('RockAlbums', 'V') AS [View],
      OBJECT_ID('RockAlbums', 'P') AS [Stored Procedure];
    

    結果:

    +---------+------------+--------------------+
    | Table   | View       | Stored Procedure   |
    |---------+------------+--------------------|
    | NULL    | 1525580473 | NULL               |
    +---------+------------+--------------------+
    
    >
    1. SQLExpressのインストール

    2. clojure.java.jdbcレイジークエリ

    3. sysdateでのto_date関数の問題

    4. SQLServerのデータ型の優先順位