Met*_*hor 2 sql-server information-schema sql-server-2014
我正在使用具有许多跨数据库视图的数据库。虽然 INFORMATION_SCHEMA.VIEWS 列出了所有这些视图,但 INFORMATION_SCHEMA.VIEW_TABLE_USAGE 和 INFORMATION_SCHEMA.VIEW_COLUMN_USAGE 没有。
所有有问题的视图都采用以下格式:
CREATE VIEW [dbo].[Invoice]
AS SELECT * FROM [otherdb].[dbo].[Invoice]
Run Code Online (Sandbox Code Playgroud)
以下查询返回 0 行:
SELECT
VIEW_CATALOG
,VIEW_SCHEMA
,VIEW_NAME
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE TABLE_CATALOG <> VIEW_CATALOG
Run Code Online (Sandbox Code Playgroud)
将 SELECT * 的适当性留给另一个讨论,为什么外部数据库引用不在 INFORMATION_SCHEMA 视图中,有什么方法可以获取它们?
是的,由于各种原因停止使用INFORMATION_SCHEMA
,包括我在那篇文章中(还)没有提到的一个,这是他们不处理跨数据库依赖关系的事实。
请改用目录视图和动态管理功能。
要获得视图,您可以使用sys.sql_expression_dependencies
:
SELECT
[schema] = s.name,
[view] = v.name,
d.referenced_database_name,
d.referenced_schema_name,
d.referenced_entity_name
FROM sys.views AS v
INNER JOIN sys.schemas AS s
ON v.[schema_id] = s.[schema_id]
INNER JOIN sys.sql_expression_dependencies AS d
ON v.[object_id] = d.referencing_id
WHERE d.referenced_database_name IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
要获取列名,您可以使用sys.dm_sql_referenced_entities
:
SELECT
[schema] = s.name,
[view] = v.name,
r.referenced_database_name,
r.referenced_schema_name,
r.referenced_entity_name,
[column] = r.referenced_minor_name
FROM sys.views AS v
INNER JOIN sys.schemas AS s
ON v.[schema_id] = s.[schema_id]
CROSS APPLY sys.dm_sql_referenced_entities
(
QUOTENAME(s.name) + N'.' + QUOTENAME(v.name), N'OBJECT'
) AS r
WHERE r.referenced_database_name IS NOT NULL
AND r.referenced_minor_name IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)