SQL 中有没有办法确定任意查询访问的所有列?

Is there a way in SQL to determine all columns accessed by an arbitrary query?

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

我们的应用程序还提供 API 作为查询存储在查询 table 中的 NVARCHAR(MAX) 字段中的查询,这些查询是针对视图以及 table 中的 table 编写的这个关键模式。

随着时间的推移,列已添加到 table 中,但 API 并没有始终跟上。

有人问我是否可以通过 SQL 找到一种方法来尽可能地识别(有些错误 positives/negatives OK),table 中的列未被提供 API 输出的视图或 SQL 查询引用。

最初这似乎可行。我在该主题上发现了一些类似的问题,例如 here and here 就如何开始提供指导......尽管我注意到即使有了这些,也有一种丑陋的后备方法看起来像:

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

当我尝试对几千个列名执行此操作时,这可能会产生误报并且 超级 很慢。

就没有什么better/more靠谱的吗?也许可以将查询编译成计划并能够从计划中确定必须访问的每一列才能提供结果?

Our application also offers APIs implemented as queries stored in NVARCHAR(MAX) fields

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

如果您使它们成为 实际 视图,您可以查看 INFORMATION_SCHEMA - 交叉引用 table/columns 到 view/columns。

假设您不想这样做,并且您准备偶尔(而不是 real-time)向 运行 写一份工作,您可以做一些 super-cheesy 动态SQL.

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

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