Зависимости столбцов SQL Server без устаревшего представления SYS

Я собираю информацию о зависимостях от "объектов" до уровня столбцов (например, хранимая процедура X использует столбцы таблицы A C0 и C1).

Я обнаружил, что моя база данных SQL Server 2012 дает мне информацию о зависимостях на уровне столбца через sys.sql_dependencies (потому что столбец referenced_minor_id не является тождественно нулевым), и она НЕ дает мне информацию о зависимостях на уровне столбца через sys.sql_expression_dependencies (потому что столбец referenced_minor_id одинаково IS нуль).

В документах говорится, что sys.sql_dependencies устарела в пользу sys.sql_expression_dependencies, однако выглядит так, как будто "более новое" представление не предоставляет информацию уровня столбца (даже если для этой цели, по-видимому, имеется столбец).

Мой вывод заключается в том, что в какой-то будущей версии SQL Server я не смогу получить информацию о зависимостях на уровне столбцов. Является ли мой вывод неверным из-за некоторой информации, которую я не упомянул?

1 ответ

Решение

Вы можете получить эту информацию, но с большим количеством работы. От sys.sql_expression_dependencies документация:

Вы можете использовать это представление каталога для сообщения информации о зависимостях для следующих объектов:

  • [другие лица]

  • Зависимости уровня столбца от связанных со схемой объектов. Зависимости уровня столбца для объектов, не связанных со схемой, можно вернуть с помощью sys.dm_sql_referenced_entities.

Таким образом, вы получаете информацию о столбце в этом представлении для объектов, связанных со схемой (например, вычисляемый столбец), но для объектов, не связанных со схемой (как, например, обычные представления), вам необходимо объединить их с sys.dm_sql_referenced_entities:

select referencing_id, objects.name as referencing_name,
  dependencies.referenced_id, dependencies.referenced_entity_name as referenced_name,
  entities.referenced_minor_id as column_id, entities.referenced_minor_name as column_name,
  is_schema_bound_reference
from sys.sql_expression_dependencies as dependencies
join sys.objects as objects on object_id=referencing_id
join sys.schemas as schemas on schemas.schema_id=objects.schema_id
cross apply sys.dm_sql_referenced_entities(schemas.name+'.'+objects.name,'OBJECT') as entities
where entities.referenced_entity_name=dependencies.referenced_entity_name
  and (is_schema_bound_reference=0 or entities.referenced_minor_id=dependencies.referenced_minor_id)

Этот запрос будет возвращать информацию о столбцах как для связанных, так и для не связанных сущностей, а также для сущностей, у которых нет столбцов, таких как скалярная функция (триггеры таблиц также включены в OBJECT тип).

В завершение, используя имя схемы в первом параметре sys.dm_sql_referenced_entities кажется необходимым, хотя синтаксическая документация показывает его как необязательный (я не получил никаких результатов, используя только имя объекта в SQL Server 2008, 2012 и 2014).

Другие вопросы по тегам