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

时间:2016-07-15 14:33:32

标签: sql intersystems-cache

我正在尝试在极大的缓存数据库中搜索与特定文本字符串匹配的列。在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,但我还没想出如何将结果集限制为用户定义的类。是否有特定属性会根据需要限制结果集?也许是班级名称上的模式?

2 个答案:

答案 0 :(得分:3)

此查询:

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

%SYS / SAMPLES / DOCBOOK之外的每个命名空间中执行将返回用户定义的表(系统表以%开头,用户不应使用以{开头的表名称{1}})

答案 1 :(得分:1)

你有什么版本的Caché?

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

public static class StringExtensions {

    public static Stream ToStream(this string s) {
        return s.ToStream(Encoding.UTF8);
    }

    public static Stream ToStream(this string s, Encoding encoding) {
        return new MemoryStream(encoding.GetBytes(s ?? ""));
    }
}

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