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

結果セットに基づいてビューの基になる列を取得します

    データベースビューの優れた点の1つは、基になるデータベーススキーマを知らなくても、複雑なクエリを実行できることです。

    はい、ビューを作成するときに基礎となるスキーマを知る必要があるのは事実ですが、それを行う必要があるのは1回だけです。作成したら、すべてのテーブル名や列名などを覚えていなくても、そのビューを1日中クエリできます。

    ビューは通常、複数のテーブルのデータを1つの仮想テーブルに結合します。これにより、「ブラックボックス」のようなものになります。設計どおりに機能する限り、隠された詳細を気にする必要はありません。

    しかし、行う場合はどうなりますか 基になるテーブルと列のビューを確認したいですか?

    sp_help システムストアドプロシージャは、ビューによって返される列に関する情報を提供しますが、ビューで参照されるベーステーブルの列に関する情報は提供しません。

    そして、はい、ビューの実際の定義を確認する方法はたくさんあります。ただし、ビューが大きい場合は、実際に関係するすべてのベーステーブルを選択しようとするだけで、斜視になるリスクがあります。

    ただし、ビューで使用されるベーステーブルと列を返すために使用できる別のメソッドがあります。

    sys.dm_exec_describe_first_result_setを使用できます ビューをクエリしたときに結果セットに関するメタデータを返すシステム動的管理関数。

    それが機能する方法は、T-SQLクエリを関数に渡すことであり、結果セットに関するメタデータを返します。この場合、関数に渡すクエリは、ビューをクエリするときに使用するクエリになります。

    このメソッドを使用する利点の1つは、ベーステーブルと列の情報を適切なリストで取得できることです。各列は別々の行にリストされています。

    また、クエリを絞り込むことで結果を絞り込むことができます。つまり、関連性のない列(つまり、ビューにはあるが特定のクエリには関連性のない列)を削除できます。

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

    SELECT 
        CONCAT(
            source_server + '.', 
            source_database + '.', 
            source_schema + '.', 
            source_table + '.', 
            source_column) AS [Source Column],
        name AS [View Column],
        user_type_name,
        system_type_name,
        max_length,
        [precision],
        scale
    FROM sys.dm_exec_describe_first_result_set(
        N'SELECT * FROM vAllCats', 
        NULL, 
        1
    );

    結果:

    +-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
    | Source Column         | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
    |-----------------------+---------------+------------------+--------------------+--------------+-------------+---------|
    | Test.dbo.Cats.CatId   | CatId         | NULL             | int                | 4            | 10          | 0       |
    | Test.dbo.Cats.CatName | CatName       | NULL             | varchar(60)        | 60           | 0           | 0       |
    +-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+

    ここでは、CONCAT()を使用することにしました。 スキーマの視覚化を容易にするために、複数の列名を連結する関数。

    この場合、「ソース列」と「ビュー列」(つまり、ビューによって返される列)は両方とも同じ名前を共有します。これは、ビューが列のエイリアスを使用していない場合に発生します。

    ソース列やテーブルなどを取得できる理由は、1を使用しているためです。 3番目の引数として。この値を使用すると、各クエリはFOR BROWSEがあるかのように分析されます。 クエリのオプション。

    ビューが列エイリアスを使用する場合

    ビューが実際の基になる列名とは異なる列エイリアスを使用している場合、それは結果に反映されます。

    この例では、列エイリアスを使用するビューをクエリします。

    SELECT 
        CONCAT(
            source_server + '.', 
            source_database + '.', 
            source_schema + '.', 
            source_table + '.', 
            source_column) AS [Source Column],
        name AS [View Column],
        user_type_name,
        system_type_name,
        max_length,
        [precision],
        scale
    FROM sys.dm_exec_describe_first_result_set(
        N'SELECT * FROM vAlbums', 
        NULL, 
        1
    );

    結果:

    +------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+
    | Source Column                      | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
    |------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------|
    | Homer.Music.dbo.Artists.ArtistName | Artist        | NULL             | nvarchar(255)      | 510          | 0           | 0       |
    | Homer.Music.dbo.Albums.AlbumName   | Album         | NULL             | nvarchar(255)      | 510          | 0           | 0       |
    | Homer.Music.dbo.Genres.Genre       | Genre         | NULL             | nvarchar(50)       | 100          | 0           | 0       |
    | Homer.Music.dbo.Artists.ArtistId   | ArtistId      | NULL             | int                | 4            | 10          | 0       |
    | Homer.Music.dbo.Albums.AlbumId     | AlbumId       | NULL             | int                | 4            | 10          | 0       |
    | Homer.Music.dbo.Genres.GenreId     | GenreId       | NULL             | int                | 4            | 10          | 0       |
    +------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+

    最初の2行を見ると、基になる列(source_columnによって返される)がわかります。 列)は、「列の表示」(nameによって返される)とは異なります 桁)。

    このビューのソース列が「Homer」と呼ばれるリンクサーバー上にあることもわかります。

    ここにあるようなブラウズモードを使用する場合(つまり、1を使用する場合)は注意が必要です。 3番目の引数として)、クエリの完了に関係する他の列(ArtistId)も取得します。 、AlbumId 、およびGenreId )、実際には結果セットに返されない場合でも。

    クエリを調整する

    sys.dm_exec_describe_first_result_setを差別化するものの1つ sp_helpなどのプロシージャから およびsp_helptext結果セットを記述しているということです ビューではありません。

    得られる結果は、ビューだけでなく、渡す実際のクエリによって異なります。

    これは前の例と同じクエリですが、今回はビューから1つの列だけを選択します(*を使用する代わりに) すべての列を選択するにはワイルドカードを使用します。

    SELECT 
        CONCAT(
            source_server + '.', 
            source_database + '.', 
            source_schema + '.', 
            source_table + '.', 
            source_column) AS [Source Column],
        name AS [View Column],
        user_type_name,
        system_type_name,
        max_length,
        [precision],
        scale
    FROM sys.dm_exec_describe_first_result_set(
        N'SELECT Album FROM vAlbums', 
        NULL, 
        1
    );

    結果:

    +----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+
    | Source Column                    | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
    |----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------|
    | Homer.Music.dbo.Albums.AlbumName | Album         | NULL             | nvarchar(255)      | 510          | 0           | 0       |
    | Homer.Music.dbo.Artists.ArtistId | ArtistId      | NULL             | int                | 4            | 10          | 0       |
    | Homer.Music.dbo.Albums.AlbumId   | AlbumId       | NULL             | int                | 4            | 10          | 0       |
    | Homer.Music.dbo.Genres.GenreId   | GenreId       | NULL             | int                | 4            | 10          | 0       |
    +----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+

    したがって、今回は、6行ではなく4行のみが返されます。

    複数のビューから基になる列を取得する

    前述のように、sys.dm_exec_describe_first_result_set 関数は、単一のビューやその他のオブジェクトだけでなく、結果セット全体を記述します。

    したがって、複数のビューとオブジェクトから基になる列を一度に見つけることができます。

    例:

    SELECT 
        CONCAT(
            source_server + '.', 
            source_database + '.', 
            source_schema + '.', 
            source_table + '.', 
            source_column) AS [Source Column],
        name AS [View Column],
        user_type_name,
        system_type_name,
        max_length,
        [precision],
        scale
    FROM sys.dm_exec_describe_first_result_set(
        N'SELECT * FROM vAllCats c INNER JOIN vAllDogs d ON c.CatName = d.DogName', 
        NULL, 
        1
    );

    結果:

    +-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
    | Source Column         | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
    |-----------------------+---------------+------------------+--------------------+--------------+-------------+---------|
    | Test.dbo.Cats.CatId   | CatId         | NULL             | int                | 4            | 10          | 0       |
    | Test.dbo.Cats.CatName | CatName       | NULL             | varchar(60)        | 60           | 0           | 0       |
    | Test.dbo.Dogs.DogId   | DogId         | NULL             | int                | 4            | 10          | 0       |
    | Test.dbo.Dogs.DogName | DogName       | NULL             | nvarchar(255)      | 510          | 0           | 0       |
    | Test.dbo.Dogs.GoodDog | GoodDog       | NULL             | bit                | 1            | 1           | 0       |
    +-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+


    1. OracleID列とselectに挿入

    2. TIMESTAMP列から日付/時刻情報を取得するにはどうすればよいですか?

    3. PostgreSQL:実行中のクエリ並列処理

    4. MariaDBに存在しない場合にのみテーブルを作成する