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

SQLServerのVIEWS情報スキーマビューを使用してビュー情報を取得する

    SQL Serverでは、Transact-SQLのVIEWSを使用できます。 現在のデータベース内の1つ以上のビューに関する情報を返すシステム情報スキーマビュー。現在のデータベースの現在のユーザーがアクセスできるビューに対して1行を返します。

    このビューを使用するには、INFORMATION_SCHEMA.VIEWSの完全修飾名を指定します 。

    例1-特定のビューに関する情報を返す

    これは、現在のユーザーが現在のデータベースでアクセスできるすべてのビューに関する情報を返す例です。

    SELECT 
      TABLE_CATALOG,
      TABLE_SCHEMA,
      TABLE_NAME,
      CHECK_OPTION,
      IS_UPDATABLE
    FROM INFORMATION_SCHEMA.VIEWS;
    

    結果:

    +-----------------+----------------+--------------+----------------+----------------+
    | TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | CHECK_OPTION   | IS_UPDATABLE   |
    |-----------------+----------------+--------------+----------------+----------------|
    | Music           | dbo            | RockAlbums   | NONE           | NO             |
    | Music           | dbo            | JazzAlbums   | NONE           | NO             |
    | Music           | dbo            | BluesAlbums  | NONE           | NO             |
    +-----------------+----------------+--------------+----------------+----------------+
    

    この例では、意図的に列を省略しています。 VIEW_DEFINITIONを省略しました 桁。コマンドラインツールを使用すると出力が台無しになるため、省略しました。以下にこの列を含む例を示します。

    Microsoftのドキュメントでは、INFORMATION_SCHEMAを使用しないように警告されていることに注意してください。 オブジェクトのスキーマを決定するためのビュー。オブジェクトのスキーマを見つける唯一の信頼できる方法は、sys.objectsにクエリを実行することです。 カタログビュー。

    例2–特定のビューに関する情報を返す

    特定のビューに関する情報を返す例を次に示します。

    SELECT 
      TABLE_CATALOG,
      TABLE_SCHEMA,
      TABLE_NAME,
      CHECK_OPTION,
      IS_UPDATABLE
    FROM INFORMATION_SCHEMA.VIEWS
    WHERE TABLE_NAME = 'RockAlbums';
    

    結果:

    +-----------------+----------------+--------------+----------------+----------------+
    | TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | CHECK_OPTION   | IS_UPDATABLE   |
    |-----------------+----------------+--------------+----------------+----------------|
    | Music           | dbo            | RockAlbums   | NONE           | NO             |
    +-----------------+----------------+--------------+----------------+----------------+
    

    ここでもVIEW_DEFINITIONを使用しています 含まれる列:

    SELECT * 
    FROM INFORMATION_SCHEMA.VIEWS
    WHERE TABLE_NAME = 'RockAlbums';
    

    結果:

    +-----------------+----------------+--------------+-------------------+----------------+----------------+
    | TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | VIEW_DEFINITION   | CHECK_OPTION   | IS_UPDATABLE   |
    |-----------------+----------------+--------------+-------------------+----------------+----------------|
    | Music           | dbo            | RockAlbums   | CREATE VIEW RockAlbums 
    AS
    SELECT AlbumName, ArtistName
    FROM Albums
            INNER JOIN Artists
            ON Albums.ArtistId = Artists.ArtistId 
        INNER JOIN Genres
        ON Albums.GenreId = Genres.GenreId
    WHERE Genres.Genre = 'Rock';                   | NONE           | NO             |
    +-----------------+----------------+--------------+-------------------+----------------+----------------+
    

    例3–ビュー定義のみを返す

    ビュー定義の欠点が私のレイアウトを台無しにしているにもかかわらず、この列は、ビュー定義を探しているだけの場合に役立ちます。

    SELECT VIEW_DEFINITION 
    FROM INFORMATION_SCHEMA.VIEWS
    WHERE TABLE_NAME = 'RockAlbums';
    

    結果:

    +-------------------+
    | VIEW_DEFINITION   |
    |-------------------|
    | CREATE VIEW RockAlbums 
    AS
    SELECT AlbumName, ArtistName
    FROM Albums
            INNER JOIN Artists
            ON Albums.ArtistId = Artists.ArtistId 
        INNER JOIN Genres
        ON Albums.GenreId = Genres.GenreId
    WHERE Genres.Genre = 'Rock';                   |
    +-------------------+
    

    例4–複数のビューのビュー定義を返す

    VIEW_DEFINITION 複数のビューのビュー定義を一度に一覧表示する場合は、列が非常に便利です。

    SELECT VIEW_DEFINITION 
    FROM INFORMATION_SCHEMA.VIEWS
    WHERE TABLE_NAME = 'RockAlbums';
    

    結果:

    +-------------------+
    | VIEW_DEFINITION   |
    |-------------------|
    | CREATE VIEW RockAlbums 
    AS
    SELECT AlbumName, ArtistName
    FROM Albums
            INNER JOIN Artists
            ON Albums.ArtistId = Artists.ArtistId 
        INNER JOIN Genres
        ON Albums.GenreId = Genres.GenreId
    WHERE Genres.Genre = 'Rock';                   |
    | CREATE VIEW JazzAlbums 
    AS
    SELECT AlbumName, ArtistName
    FROM Albums
            INNER JOIN Artists
            ON Albums.ArtistId = Artists.ArtistId 
        INNER JOIN Genres
        ON Albums.GenreId = Genres.GenreId
    WHERE Genres.Genre = 'Jazz';                   |
    | CREATE VIEW BluesAlbums 
    AS
    SELECT AlbumName, ArtistName
    FROM Albums
            INNER JOIN Artists
            ON Albums.ArtistId = Artists.ArtistId 
        INNER JOIN Genres
        ON Albums.GenreId = Genres.GenreId
    WHERE Genres.Genre = 'Blues';                   |
    +-------------------+
    (3 rows affected)
    

    例5–大きなビュー定義を返す

    VIEW_DEFINITION 列の最大長はnvarchar(4000) 。これより大きいビュー定義の場合は、OBJECT_DEFINITION()を使用できます。 関数(OBJECT_ID()と一緒に 関数)完全な定義を返します。

    OBJECT_DEFINITION()の戻り値 関数はnvarchar(max)です 、したがって、VIEW_DEFINITIONの文字制限はありません 列(前述のとおり、 nvarchar(4000)

    例:

    SELECT 
      OBJECT_DEFINITION(OBJECT_ID(TABLE_NAME))
    FROM INFORMATION_SCHEMA.VIEWS
    WHERE TABLE_NAME = 'RockAlbums';
    

    結果:

    +--------------------+
    | (No column name)   |
    |--------------------|
    | CREATE VIEW RockAlbums 
    AS
    SELECT AlbumName, ArtistName
    FROM Albums
            INNER JOIN Artists
            ON Albums.ArtistId = Artists.ArtistId 
        INNER JOIN Genres
        ON Albums.GenreId = Genres.GenreId
    WHERE Genres.Genre = 'Rock';                    |
    +--------------------+
    

    明らかに、この例はOBJECT_DEFINITION()を使用する利点を示していません ビュー定義が小さすぎるため、関数ですが、ビュー定義が非常に大きい場合は、この例が役立つことを願っています。


    1. OracleDatabaseTestingの課題-スキーマデータの比較

    2. RailsとPostgreSQLを使用してオカレンスを含むグループ化されたリストを返します

    3. UTF8のエンコーディングがロケールen_USと一致しません。選択したLC_CTYPE設定には、LATIN1のエンコードが必要です

    4. SQLでアルファベット順に並べ替える方法