web-dev-qa-db-ja.com

データベースのストアドプロシージャで使用されるテーブルのリストを取得する

当社はレポートサーバーデータベースの管理を計画しており、要件は運用サーバーデータベースのストアドプロシージャで使用されるテーブルのリストを取得することです。この情報を取得するためのクエリ/関数はありますか?

1
Heisenberg

動的SQLを使用してテーブル名を作成する(またはそれらを引数として受け入れる)か、ネストされたビューを使用する場合、これを自動化することは非常に困難になります。ただし、従来のT-SQLと適切な参照に固執する場合は、次のようにしてそこに到達できます。

DECLARE @procid int = OBJECT_ID(N'dbo.procedurename');

;WITH src AS 
(
  SELECT name = 
      COALESCE(QUOTENAME(d.referenced_server_name)   + N'.', N'')
    + COALESCE(QUOTENAME(d.referenced_database_name) + N'.', N'')
    + QUOTENAME(d.referenced_schema_name) + N'.'
    + QUOTENAME(d.referenced_entity_name)
  FROM sys.sql_expression_dependencies AS d
  WHERE d.referencing_id = @procid
)
SELECT name FROM src GROUP BY name;

そして、すべての参照のカタログが必要な場合は、これを行うことができます:

;WITH src AS 
(
  SELECT [procedure] = QUOTENAME(s.name) + N'.' + QUOTENAME(o.name),
      ref = 
      COALESCE(QUOTENAME(d.referenced_server_name)   + N'.', N'')
    + COALESCE(QUOTENAME(d.referenced_database_name) + N'.', N'')
    + QUOTENAME(d.referenced_schema_name) + N'.'
    + QUOTENAME(d.referenced_entity_name)
  FROM sys.sql_expression_dependencies AS d
  INNER JOIN sys.objects AS o
  ON d.referencing_id = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE o.[type] = N'P'
)
SELECT [procedure],ref 
  FROM src
  GROUP BY [procedure],ref;
5
Aaron Bertrand