【问题标题】:How to check if columns are being used by views?如何检查视图是否正在使用列?
【发布时间】:2015-08-12 17:56:08
【问题描述】:

我有一个 Excel 表,其中列出了其中提到的列。我现在想知道 sql 中的视图正在使用 excel 表中存在的所有列(在 ssms 中工作)。 excel中的数据只是列名的列表。 好像。

列名

DimCurrencyId

Dimzoneid

.......

近 1000 个列名。

现在我需要确定这些是否在 sql 视图中使用?

我有近 500 次观看 谁能告诉我最简单的方法,这样我就可以跳过大量的手动工作?

【问题讨论】:

  • 简而言之,我想列出依赖于我拥有的任何列的所有数据库视图

标签: sql sql-server excel shell powershell


【解决方案1】:

可能有一种更优雅的方法来执行此操作,但我会使用 Excel 文件生成 SQL 语句列表,然后将它们复制并粘贴到 SQL Server Management Studio 并执行整个列表。

假设您的列名以单元格 A2 开头,我会将以下公式放入单元格 B2(或下一个可用列)中:

="select distinct sys.all_views.name from sys.all_views join sys.all_columns on sys.all_views.object_id = sys.all_columns.object_id where sys.all_columns.name = '"&A2&"' union"

或者,不需要加入(来自ElenaDBA's 答案):

="SELECT TABLE_NAME as [View Name] FROM   INFORMATION_SCHEMA.VIEWS WHERE  VIEW_DEFINITION LIKE '%"&A2&"%' UNION"

将公式拖到列列表的末尾。

将生成的 SQL 语句复制并粘贴到 SSMS 中,并确保在最后删除尾随 union(最后一个查询不会合并任何内容,如果您尝试执行 SQL,则会收到错误消息尾随 union 语句)。

执行 SQL,您应该会得到一个视图名称列表。 Union 自动消除重复。

同样,不优雅,但我相信这会完成工作。

更新

要显示视图名称和列名称,您只需在 A 列中添加对单元格的另一个引用即可获取您的列。此外,我们可以修改WHERE 子句,使其仅查看dbo 架构。

对于将变为(dbo 的schema_id 为 1)的第一个公式:

="select distinct sys.all_views.name, '"&A2&"' as 'colName' from sys.all_views join sys.all_columns on sys.all_views.object_id = sys.all_columns.object_id where sys.all_columns.name = '"&A2&"'  and schema_id = 1 union"

基本上将您在 where 子句中搜索的值添加到选择部分。

第二个公式,使用相同的想法,看起来像这样(架构被名称引用):

="SELECT TABLE_NAME as [View Name] , '"&A2&"' as 'colName' FROM   INFORMATION_SCHEMA.VIEWS WHERE  VIEW_DEFINITION LIKE '%"&A2&"%' AND TABLE_SCHEMA = 'dbo'  UNION"

【讨论】:

  • 如果您能告诉我一种方法来查找与 WHERE 子句匹配的列名,我将不胜感激。
  • 您只是希望它们作为 SQL 查询的一部分返回?如果我理解正确,列名已经在 Excel 中可用,因此无需为它们查询表,因为您已经拥有它们。如果您只是希望它们显示,您可以稍微调整查询,我将添加到我的答案中。
  • 是的,我也希望显示列名。因为我只想找到与视图匹配的那些列,所以并非所有列都存在。我也希望它只针对模式'dbo'。你能帮我解决这个问题吗?
  • 我试过这个:select distinct sys.all_views.name AS View_Name, sys.all_columns.name as Column_Name from sys.all_views join sys.all_columns on sys.all_views.object_id = sys.all_columns.object_id where schema_name(schema_id) = 'dbo' and sys.all_columns.name = 'CancellationDtID' union 但是我得到的视图数量非常少。不会导致相同数量的视图。而且您的两个答案都导致不同的行数。 Elena 提供的结果是 43 行,而你的结果是 13 行。
  • 我更新了我的查询以包括如何仅检查 dbo 架构。不幸的是,在不知道您拥有多少数据库、模式等的情况下,这对我来说更加困难。结果的不同在于我的查询只会在活动数据库上运行,而第二个查询应该在服务器上的所有数据库上运行。
【解决方案2】:

尝试:

SELECT TABLE_NAME as [View Name]
FROM   INFORMATION_SCHEMA.VIEWS 
WHERE  VIEW_DEFINITION LIKE '%YourColumnName%'

【讨论】:

  • 如果您能告诉我一种查找与 WHERE 子句匹配的列名的方法,我将不胜感激
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 2015-09-05
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2014-06-08
相关资源
最近更新 更多