最も投票数の多い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以降で動作します
変更のリスト:
-
sysdependssys.sql_dependenciesに置き換える必要があります- 新しいテーブルは
object_idを使用しますidの代わりに - 新しいテーブルは
referenced_major_idを使用しますdepidの代わりに
- 新しいテーブルは
-
sysobjectsの使用 より焦点を絞ったシステムカタログビューに置き換える必要があります- marc_sが指摘したように、代わりに
sys.tablesを使用してください およびsys.procedures - 注 :これにより、
o.xtype = 'p'の場所を確認する必要がなくなります。 (など)
- marc_sが指摘したように、代わりに
-
また、
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