SQL中是否可以确定任意查询访问的所有列?

问题描述

支持一个数据库,该数据库包含一个架构,该架构包含数百个包含我们最重要数据的表。

我们的应用程序还提供了API,这些API实现为存储在查询表的NVARCHAR(MAX)字段中的查询,这些查询是针对视图以及此关键方案中的表编写的。

随着时间的流逝,列已添加到表中,但API并不总是跟上。

有人问我是否可以通过sql找到一种方法,以尽可能地识别表或视图所未提供的SQL查询所引用的表中的列(某些误报/否定的行)。 API输出

最初,这似乎是可行的。我在该主题上发现了一些类似的问题,例如herehere,它们为如何开始提供了指导...尽管我注意到即使有这些问题,也存在某种丑陋的后备方法如下:

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

当我尝试为成千上万的列名称进行操作时,很可能会产生误报以及 super 变慢。

没有更好/更可靠的东西吗?也许可以将查询编译成计划并能够从计划中确定为提供结果而必须访问的每一列的东西?

解决方法

我们的应用程序还提供了实现为存储在查询中的API NVARCHAR(MAX)个字段

所以您已经重新实现了视图? :)

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

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

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

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