【发布时间】:2011-02-10 04:03:25
【问题描述】:
我一直在尝试编写一些 SQL 代码,当提供视图时,这些代码将定位视图列引用的列,并确定这些列上是否有任何索引。最终目标是为用户提供在查询视图时可以使用的列列表。
目前虽然我只能找到视图使用的列(以及扩展它们的索引),但我无法将它们匹配回索引的列。
例如:
我有TableA,它有 5 列:ID、Name、Val1、Val2、TableBID
我有 TableB,它有 3 列:ID、Name、Code
然后我创建一个视图View1,即:
SELECT A.ID,
Name,
Val1
FROM TableA A
INNER JOIN TableB ON A.TableBID = B.ID
WHERE B.Code = 'AAA'
当我使用以下方法查询参考文献时:
SELECT *
FROM sys.dm_sql_referenced_entities('dbo.View1', 'OBJECT')
我将获得其中的表/列引用列表,但没有指明哪个视图列引用了什么。
有什么方法可以访问我需要的信息,请记住我无法进行名称匹配,因为别名中的列可能使用别名,因此可能与基础数据的名称不同。
如果有任何影响,我正在使用 SQL Server 2008 SP1。
【问题讨论】:
-
最终用户不应该关心索引
-
如果“最终目的是为用户提供在查询视图时可以使用的列列表”,那么只显示所有列。不必在字段上建立索引即可对其进行查询。
-
它旨在为具有特别高权限的用户提供管理界面,列可以标记为“可搜索”,但此状态的默认值将由索引的存在决定。它适用于表,但对于视图,因为我无法将视图的别名列与其基础表列匹配,我无法确定那里是否有索引。我可能没有很好地解释它,但此功能旨在允许生成查询 where 子句。通过引导用户使用索引列来减少生成缓慢 SQL 语句的机会。
标签: tsql sql-server-2008