いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

シノニム、プロシージャとファンクションの定義情報を取得 (sys.synonyms, sys.procedures, sys.objects, sys.sql_modules)


ついでに、シノニムとプロシージャとファンクションの定義情報の取得方法をメモメモ。


[シノニム]

USE AdventureWorks
GO

/* シノニムの定義を取得 */
SELECT
      DB_NAME()                       AS db_name
     ,SCHEMA_NAME(synonyms.schema_id) AS schema_name
     ,synonyms.name                   AS synonyms_name
     ,synonyms.base_object_name       AS base_object_name
FROM
    sys.synonyms synonyms
ORDER BY
    db_name, schema_name, synonyms_name

GO


[プロシージャ]

USE AdventureWorks
GO

/* プロシージャの定義を取得する */
SELECT
      DB_NAME()                         AS db_name
     ,SCHEMA_NAME(procedures.schema_id) AS schema_name
     ,procedures.name                   AS procedure_name
     ,modules.definition                AS definition
FROM
    sys.procedures procedures
        INNER JOIN sys.sql_modules modules
        ON
            procedures.object_id = modules.object_id
ORDER BY
    db_name, schema_name, procedure_name
    
GO


[ファンクション]

USE AdventureWorks
GO

/* ファンクションの定義を取得する */
SELECT
     DB_NAME()                   AS db_name
    ,SCHEMA_NAME(objs.schema_id) AS schema_name
    ,objs.name                   AS function_name
    ,modules.definition          AS definition
FROM
    sys.objects objs
        INNER JOIN sys.sql_modules modules
        ON
            objs.object_id = modules.object_id
WHERE
    /* 
        FN: SQL スカラ関数, 
        FS: アセンブリ (CLR) スカラ関数, 
        FT: アセンブリ (CLR) テーブル値関数, 
        IF: SQL インライン テーブル値関数, 
        TF: SQL テーブル値関数
        
        を対象とする。
    */
    objs.type IN ('FN', 'FS', 'FT', 'IF', 'TF')
ORDER BY
    db_name, schema_name, function_name
    
GO


ファンクションの情報の取り方のみが変則パターンですね。
最初、どこに定義されているのか分りませんでしたw


でも、よくよく考えてみると、全部やろうと思えばsys.objectsから
取得できることに気づいた・・・。w typeで識別すればいいんですね〜。