使用 SQL 在 Intersystems Cache 中搜索用户定义的列的最简单方法是什么?

What is the easiest way to search for user-defined columns in Intersystems Cache using SQL?

我正在尝试在一个非常大的缓存数据库中搜索与特定文本字符串匹配的列。在 T-SQL 中,我们可以简单地查询 sys.columns 视图,然后将其连接到 sys.tables 以获取所有表的名称,这些表的列与我们要查找的文本相匹配.

SELECT b.name AS table_name, a.name AS column_name
FROM sys.columns a
INNER JOIN sys.tables b ON a.object_id = b.object_id
WHERE b.type = 'U' AND a.name LIKE '%SEARCHTEXT%'

我试过查询 %DICTIONARY.COMPILEDPROPERTY,但我还没有想出如何将结果集限制为用户定义的 classes。是否有特定的 属性 会根据需要限制结果集?也许是 class 名字上的图案?

你有什么版本的 Caché?

从 2015.1 开始,您可以使用 INFORMATION_SCHEMA 架构

SELECT b.table_name AS table_name, a.column_name AS column_name
FROM INFORMATION_SCHEMA.columns a
INNER JOIN INFORMATION_SCHEMA.tables b ON a.table_name = b.table_name
WHERE b.table_type <> 'SYSTEM TABLE' and a.column_name LIKE '%Age%'

INFORMATION_SCHEMA 中的完整表格列表在 Class 参考 http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&PACKAGE=1&CLASSNAME=INFORMATION.SCHEMA

这个查询:

SELECT 
  parent AS class,
  parent->SqlQualifiedNameQ As table_name,
  name AS property
FROM %Dictionary.CompiledProperty 
WHERE NOT parent->id %STARTSWITH '%'

%SYS/SAMPLES/DOCBOOK 之外的每个命名空间中执行将 return 用户定义 tables(系统 tables 开始对于 %,用户不应使用 table 以 %)

开头的名称