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

T-SQL:テーブルに関連するストアドプロシージャを周期的に表示します

    これは、テーブルとストアドプロシージャの両方に情報スキーマを使用します。 ROUTINE_TYPE条件を変更または削除して関数を追加したり、テーブルタイプを変更してビューを返すことができます。

    この回答は、ストアドプロシージャがどのテーブルに依存しているかを確認することで結果を生成します。これは、クエリテキストに名前が含まれているかどうかを確認するよりもはるかに正確な結果になると思います。プロシージャがコメントセクションのテーブルを参照している場合、この結果は最初のクエリでは返されませんが、2番目の回答とその他の回答で返されます。

    SELECT t.TABLE_NAME, s.ROUTINE_NAME
    FROM INFORMATION_SCHEMA.TABLES t
    INNER JOIN INFORMATION_SCHEMA.ROUTINES s ON
        s.ROUTINE_NAME IN (SELECT referencing_entity_name 
            FROM sys.dm_sql_referencing_entities(TABLE_SCHEMA + '.' + TABLE_NAME, 'OBJECT'))
        AND s.ROUTINE_TYPE = 'PROCEDURE'
    WHERE t.TABLE_TYPE = 'BASE TABLE'
    

    編集 :関数なしで依存関係を取得する方法は次のとおりです。 (私はこの方法が一番好きです)

    SELECT DISTINCT t.name [TableName], p.name [ProcedureName]
    FROM sys.objects t 
    LEFT JOIN sys.sql_dependencies d ON
        d.referenced_major_id = t.object_id
    LEFT JOIN sys.objects p ON
        p.object_id = d.object_id
        AND p.type = 'p'
    WHERE t.type = 'u'
    

    特定の用途がテーブル名に一致する文字列を見つけることだけである場合は、以下が機能します。

    SELECT t.TABLE_NAME, s.ROUTINE_NAME 
    FROM INFORMATION_SCHEMA.TABLES t
    INNER JOIN INFORMATION_SCHEMA.ROUTINES s 
        ON CHARINDEX(t.TABLE_NAME, s.ROUTINE_DEFINITION) > 0
        AND s.ROUTINE_TYPE = 'PROCEDURE'
    WHERE t.TABLE_TYPE = 'BASE TABLE'
    


    1. MySqlを使用して利用可能な部屋を確認する

    2. PRAGMAEXCEPTION_INITを使用してユーザー定義の例外を宣言する方法

    3. GeoServerはPostgreSQLの更新可能なビューに書き込みません

    4. 2つの可能なテーブルのいずれかにMySQL外部キーを実行することは可能ですか?