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

SQLServerデータベース内のすべてのテーブル値関数を一覧表示する2つの方法

    この記事では、SQLServerデータベース内のテーブル値関数のリストを返す2つの方法を紹介します。

    オプション1-ルーチン情報スキーマビュー

    ROUTINESを使用できます データベース内のすべてのテーブル値関数のリストを取得するための情報スキーマビュー。

    このビューは、現在のデータベースの現在のユーザーがアクセスできるストアドプロシージャと関数ごとに1行を返します。これには、テーブル値関数ではないルーチンが含まれる可能性があるため、WHEREを追加する必要があります テーブル値関数のみに絞り込むための句。

    USE Music;
    SELECT 
      ROUTINE_SCHEMA,
      ROUTINE_NAME,
      ROUTINE_TYPE,
      DATA_TYPE
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_TYPE = 'FUNCTION'
    AND DATA_TYPE = 'TABLE';
    

    結果:

    +------------------+-------------------------+----------------+-------------+
    | ROUTINE_SCHEMA   | ROUTINE_NAME            | ROUTINE_TYPE   | DATA_TYPE   |
    |------------------+-------------------------+----------------+-------------|
    | dbo              | ufn_AlbumsByGenre       | FUNCTION       | TABLE       |
    | dbo              | ufn_AlbumsByArtist      | FUNCTION       | TABLE       |
    | dbo              | ufn_AlbumsByGenre_MSTVF | FUNCTION       | TABLE       |
    +------------------+-------------------------+----------------+-------------+
    

    この場合、 音楽 データベースには、3つのテーブル値関数が含まれています。

    ROUTINE_TYPE 列は PROCEDURE を返します ストアドプロシージャおよび FUNCTION の場合 関数の場合。 DATA_TYPE 列は TABLE を返します テーブル値関数の場合のみ。したがって、ROUTINE_TYPEを省略できたはずです。 WHEREの列 条項ですが、とにかく含めました。

    関数の定義を返す

    このビューには、ROUTINE_DEFINITIONもあります 定義を含む列。上記のクエリを変更して、1つのルーチンの定義を返す例を次に示します。

    SELECT TOP(1) ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_TYPE = 'FUNCTION'
    AND DATA_TYPE = 'TABLE';
    

    結果:

    +----------------------+
    | ROUTINE_DEFINITION   |
    |----------------------|
    | 
    CREATE FUNCTION [dbo].[ufn_AlbumsByGenre](@GenreId int)
    RETURNS TABLE
    AS
    RETURN(  
        SELECT 
          ar.ArtistName,
          al.AlbumName,
          g.Genre
        FROM Genres g 
          INNER JOIN Albums al
            ON g.GenreId = al.GenreId 
          INNER JOIN Artists ar 
            ON al.ArtistId = ar.ArtistId
        WHERE g.GenreId = @GenreId
    );                      |
    +----------------------+
    

    この場合、TOP()を使用しました 結果を1行だけに制限する句ですが、TOP()を削除することで、すべての関数の定義を簡単に一覧表示できます。 条項。

    オプション2–sys.objectsシステムカタログビュー

    テーブル値関数のリストを返す別の方法は、sys.objectsをクエリすることです。 システムカタログビュー。

    SELECT 
      SCHEMA_NAME(schema_id) AS [Schema],
      name,
      type_desc
    FROM sys.objects
    WHERE type IN ('IF', 'TF', 'FT');
    

    結果:

    +----------+-------------------------+----------------------------------+
    | Schema   | name                    | type_desc                        |
    |----------+-------------------------+----------------------------------|
    | dbo      | ufn_AlbumsByGenre       | SQL_INLINE_TABLE_VALUED_FUNCTION |
    | dbo      | ufn_AlbumsByArtist      | SQL_INLINE_TABLE_VALUED_FUNCTION |
    | dbo      | ufn_AlbumsByGenre_MSTVF | SQL_TABLE_VALUED_FUNCTION        |
    +----------+-------------------------+----------------------------------+
    

    関数の定義を返す

    sys.sql_modulesでこれに参加できます 定義を返すかどうかを確認します。

    例:

    SELECT TOP(1) definition
    FROM sys.objects o
    INNER JOIN sys.sql_modules m 
    ON o.object_id = m.object_id
    WHERE type IN ('IF', 'TF', 'FT');
    

    結果:

    +--------------+
    | definition   |
    |--------------|
    | 
    CREATE FUNCTION [dbo].[ufn_AlbumsByGenre](@GenreId int)
    RETURNS TABLE
    AS
    RETURN(  
        SELECT 
          ar.ArtistName,
          al.AlbumName,
          g.Genre
        FROM Genres g 
          INNER JOIN Albums al
            ON g.GenreId = al.GenreId 
          INNER JOIN Artists ar 
            ON al.ArtistId = ar.ArtistId
        WHERE g.GenreId = @GenreId
    );              |
    +--------------+
    

    繰り返しますが、これはTOP()を使用します 結果を1行だけに制限する句。


    1. セッションでOracleで使用されている通貨記号を確認する

    2. JSON_TYPE()–MySQLでJSON値のタイプを取得します

    3. Nullを使用したSQLServer文字列の連結

    4. psql \copymeta-commandでエラーを無視する方法