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

ストアドプロシージャのテーブルのリストを取得するにはどうすればよいですか?

    最も投票数の多い2つの回答では、避けるべき非推奨のテーブルが多数使用されています。
    これを行うには、はるかにクリーンな方法があります。

    ストアドプロシージャが依存するすべてのテーブルを取得します:

    SELECT DISTINCT p.name AS proc_name, t.name AS table_name
    FROM sys.sql_dependencies d 
    INNER JOIN sys.procedures p ON p.object_id = d.object_id
    INNER JOIN sys.tables     t ON t.object_id = d.referenced_major_id
    ORDER BY proc_name, table_name
    

    MS SQLSERVER2005以降で動作します

    変更のリスト:

    • sysdepends sys.sql_dependenciesに置き換える必要があります
      • 新しいテーブルはobject_idを使用します idの代わりに
      • 新しいテーブルはreferenced_major_idを使用します depidの代わりに
    • sysobjectsの使用 より焦点を絞ったシステムカタログビューに置き換える必要があります
      • marc_sが指摘したように、代わりにsys.tablesを使用してください およびsys.procedures
      • :これにより、o.xtype = 'p'の場所を確認する必要がなくなります。 (など)
    • また、ROW_NUMBER()を使用するCTEは実際には必要ありません。 ちょうど 各レコードセットが1つだけ返されるようにするためです。それがDISTINCT あります!

      • 実際、SQLは、舞台裏でDISTINCTを使用するのに十分スマートです。
      • 私は証拠を提出します:別紙A 。次のクエリには同じ実行プランがあります!

        -- Complex
        WITH MyPeople AS (
          SELECT id, name,
          ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY id, name) AS row
          FROM People)
        SELECT id, name
        FROM MyPeople
        WHERE row = 1
        
        -- Better
        SELECT DISTINCT id, name
        FROM People
        


    1. クラウド内のMySQL-AmazonRDSの長所と短所

    2. MySQLの不正な日時値: '0000-00-00 00:00:00'

    3. SQLiteはUNIXEPOCH()関数を導入します

    4. mysql接続を閉じることは重要ですか?