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