确定用于在SQL Server 2008上执行某些SQL的所有列

时间:2013-05-22 11:12:41

标签: sql sql-server-2008

我有数百个SQL Server存储过程和脚本文件,我需要为每个人确定他们使用的确切表和列。这样做并不容易,因为SQL很复杂,许多表都有相同名称的列等......

我发现下面的SQL对于存储过程将告诉我它使用了哪些表,但是我需要深入到列级别并且空白。

有没有人有任何SQL脚本可以实现这一点,或者实际上一些.NET代码也可以,因为我们可以用一点点应用程序编写它。

SELECT 
    OBJECT_NAME(referencing_id) AS referencing_entity_name, 
    o.type_desc AS referencing_desciption, 
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id, 
    referencing_class_desc, referenced_class_desc,
    referenced_server_name, referenced_database_name, referenced_schema_name,
    referenced_entity_name, 
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,
    is_caller_dependent, is_ambiguous
FROM 
    sys.sql_expression_dependencies AS sed
INNER JOIN 
    sys.objects AS o ON sed.referencing_id = o.object_id
WHERE 
    referencing_id = OBJECT_ID(N'MySchenma.MyStoredProcedure');

1 个答案:

答案 0 :(得分:1)

select distinct
  object_name(objs.referencing_id) as referencing_entity_name,
  cols.referenced_entity_name,
  cols.referenced_minor_name
from
  sys.sql_expression_dependencies objs
  outer apply sys.dm_sql_referenced_entities( OBJECT_SCHEMA_NAME(objs.referencing_id) + N'.' + object_name(objs.referencing_id), N'OBJECT' ) as cols
where
  objs.referencing_id = object_id(N'MySchenma.MyStoredProcedure')
order by
  object_name(objs.referencing_id)
  cols.referenced_entity_name,
  cols.referenced_minor_name
;