【问题标题】:How to find which views are using a certain table in SQL Server (2008)?如何查找哪些视图正在使用 SQL Server (2008) 中的某个表?
【发布时间】:2012-03-25 23:08:11
【问题描述】:

我必须在一个表中添加几列,并且我还需要将这些列添加到使用该表的所有视图中。

是否可以获得数据库中使用某个表的所有视图的列表?

【问题讨论】:

    标签: sql sql-server views


    【解决方案1】:

    应该这样做:

    SELECT * 
    FROM   INFORMATION_SCHEMA.VIEWS 
    WHERE  VIEW_DEFINITION like '%YourTableName%'
    

    【讨论】:

    • 感谢SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE VIEW_DEFINITION like '%YourTableName.%' OR VIEW_DEFINITION like '%YourTableName]%' OR VIEW_DEFINITION like '%YourTableName %'
    • 嘿,downvoter,你迟到了 5 年 :-) 你不喜欢什么?
    • 它会改进这个答案添加一个免责声明,这将只搜索当前选定目录的视图而不是整个数据库服务器。我花了一段时间才意识到……
    • 呃,square brackets have a special meaning in a LIKE clause。示例:select 1 where 'e' like '%[YourTableName]%'。你应该做类似VIEW_DEFINITION like '%\[YourTableName\]%' ESCAPE '\'
    • 在我的情况下,为了让它正常工作,我必须修改类似的条件,所以它没有方括号,'%MyTableName%'
    【解决方案2】:

    要查找表依赖项,您可以使用 sys.sql_expression_dependencies 目录视图:

    SELECT 
    referencing_object_name = o.name, 
    referencing_object_type_desc = o.type_desc, 
    referenced_object_name = referenced_entity_name, 
    referenced_object_type_desc =so1.type_desc 
    FROM sys.sql_expression_dependencies sed 
    INNER JOIN sys.views o ON sed.referencing_id = o.object_id 
    LEFT OUTER JOIN sys.views so1 ON sed.referenced_id =so1.object_id 
    WHERE referenced_entity_name = 'Person'  
    

    您还可以试用ApexSQL Search 一个免费的 SSMS 和 VS 插件,它还具有查看依赖项功能。查看依赖项功能能够可视化所有 SQL 数据库对象的关系,包括加密对象和系统对象之间的关系、SQL Server 2012 特定对象以及存储在使用透明数据加密 (TDE) 加密的数据库中的对象

    免责声明:我作为支持工程师在 ApexSQL 工作

    【讨论】:

    • 这是正确答案。接受的答案很容易返回错误的结果,例如。如果您有另一个名称相似但更长的表。
    • 嗯,这个神奇的字符串Person 是什么意思?
    【解决方案3】:

    如果您需要按名称查找数据库对象(例如表、列、触发器) - 请查看名为 SQL SearchFREE Red-Gate 工具 - 它会搜索您的整个任何类型字符串的数据库。

    对于任何 DBA 或数据库开发人员来说,它都是必备工具 - 我是否已经提到它绝对免费可用于任何用途??

    【讨论】:

    • 我与他们没有任何隶属关系,但如果您有能力通过 SQLCompare 和 SQLDataCompare 购买或拥有您的公司,它们是非常强大的产品!
    • 值得一提的是,我很确定它不会搜索搜索加密对象
    【解决方案4】:

    我觉得这个效果更好:

    SELECT type, *
    FROM sys.objects
    WHERE OBJECT_DEFINITION(object_id) LIKE '%' + @ObjectName + '%'
    AND type IN ('V')
    ORDER BY name
    

    INFORMATION_SCHEMA.VIEWS 中过滤VIEW_DEFINTION 给了我不少误报。

    【讨论】:

      【解决方案5】:

      选择你的表 -> 查看依赖项 -> 依赖的对象

      【讨论】:

      • 我发现这很少能返回准确的结果。
      • 我相信这只返回带有模式绑定的数据库对象 - 并非所有视图等都必须有这个。
      【解决方案6】:
      SELECT VIEW_NAME
      FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
      WHERE TABLE_NAME = 'Your Table'
      

      【讨论】:

      • 我发现 INFORMATION_SCHEMA.VIEW_TABLE_USAGE 不是那么可靠。它应该列出特定视图所依赖的基表和视图。不幸的是,在我的情况下(SQL 2012),至少有一个视图没有被报告为依赖
      • 我发现 INFORMATION_SCHEMA.VIEW_TABLE_USAGE 不是那么可靠。它应该列出特定视图所依赖的基表和视图。不幸的是,在我的情况下(SQL 2012),IS.VTU 视图中甚至没有一个视图,更不用说它所依赖的视图/表了。我试图用它来确定必须重新创建的订单视图,在删除它们之后......
      【解决方案7】:

      使用以下查询查找表名的已用视图或存储过程的最简单方法 -

      exec dbo.dbsearch 'Your_Table_Name'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 2018-04-26
        相关资源
        最近更新 更多