SQL中是否有一种方法可以确定任意查询访问的所有列



我支持一个包含模式的数据库,该模式有几百个表,其中包含我们最重要的数据。

我们的应用程序还提供了API,这些API被实现为存储在查询表中NVARCHAR(MAX(字段中的查询,这些查询是根据该关键模式中的视图和表编写的。

随着时间的推移,列已经添加到表中,但API并不总是保持不变。

有人问我是否可以通过SQL找到一种方法来尽可能地识别表中未被视图或提供API输出的SQL查询引用的列(有些假阳性/阴性没问题(。

起初,这似乎是可行的。我在这个话题上发现了一些类似的问题,比如这里和这里,这些问题可以指导如何开始。。。尽管我注意到,即使有了这些,也有一种丑陋的后备方法,看起来像:

OBJECT_DEFINITION(OBJECT_ID([Schema].[View])) LIKE '%' + [Column] + '%'

当我尝试为几千个列名执行此操作时,这可能会产生误报,并且速度非常慢。

难道没有比这更好/更可靠的东西吗?也许可以将查询编译到计划中,并能够从计划中确定必须访问的每一列才能交付结果?

我们的应用程序还提供了作为存储在NVARCHAR(MAX(字段

所以您重新实现了视图?:(

如果您使它们成为实际的视图,您可以查看INFORMATION_SCHEMA-交叉引用表/列以查看/列。

假设你不想这样做,并且你准备写一个偶尔运行(而不是实时运行(的作业,你可以做一些超级俗气的动态SQL。

  1. 使用光标循环浏览存储在NVARCHAR(MAX(中的定义
  2. 从NVARCHAR(MAX(中的SQL创建临时视图或SP
  3. 从您的临时视图/SP中检查INFORMATION_SCHEMA,并将其放入临时保存表中
  4. 对所有查询执行此操作,则会得到一个引用列的列表

相当丑陋,但对于API与数据库的战术扫描应该是可行的。

最新更新