最も投票数の多い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'
の場所を確認する必要がなくなります。 (など)
- 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