【问题标题】:DB2 dinamic searchDB2 动态搜索
【发布时间】:2026-01-22 22:55:01
【问题描述】:

我需要创建搜索(如 '%-99' 或 '%NON%')---在所有列中的 DB2 中的 SYS 中的所有表 -- 下面的代码 ---请帮助---这是测试代码---但是我有 DB2 数据库错误:错误 [42703] [IBM][DB2/LINUXX8664] SQL0206N “WHERE”在使用它的上下文中无效。

声明全局临时表会话.TEMP_DINAMIC_TEST_SEARCH ( 制表符 VARCHAR(128) , 表模式 VARCHAR(128) , 选项卡名称 VARCHAR(128) , COLUMN_NAME VARCHAR(128) , ROW_COUNT BIGINT ) 在提交时保留未记录的行 ;

BEGIN
FOR C AS CUR CURSOR WITH HOLD FOR
    SELECT 'INSERT INTO SESSION.TEMP_DINAMIC_TEST_SEARCH SELECT ''' 
    ||''' ,''' || TABLE_SCHEM || ''',''' || TABLE_NAME || ''',''' || COLUMN_NAME || ''', COUNT( DISTINCT(' || COLUMN_NAME || ')) FROM '
    || '"' ||  TABLE_SCHEM || '"."' || TABLE_NAME|| '"' ||WHERE|| '"' || COLUMN_NAME || '"' || LIKE || '"' ||'%-99'|| '"' || AS S
    FROM SYSIBM.SQLCOLUMNS
    WHERE TABLE_SCHEM = 'DWD' AND TABLE_NAME LIKE 'T_X_%'
    WITH UR
DO
      EXECUTE IMMEDIATE C.S;
      COMMIT;
END FOR;
END

【问题讨论】:

    标签: db2


    【解决方案1】:

    使用了错误的表达方式。
    试试这个:

    SELECT 
       'INSERT INTO SESSION.TEMP_DINAMIC_TEST_SEARCH SELECT ''' 
    || ''' ,''' || TABLE_SCHEM || ''',''' || TABLE_NAME || ''',''' || COLUMN_NAME || ''', COUNT( DISTINCT(' || COLUMN_NAME || ')) FROM '
    || '"' ||  TABLE_SCHEM || '"."' || TABLE_NAME|| '" WHERE "' || COLUMN_NAME || '" LIKE ''%-99''' AS S
    FROM SYSIBM.SQLCOLUMNS
    WHERE TABLE_SCHEM = 'DWD' AND TABLE_NAME LIKE 'T_X_%'
    /*
    AND 
    (
       TYPE_NAME LIKE '%CHAR' 
    OR TYPE_NAME LIKE '%GRAPHIC'
    OR TYPE_NAME LIKE '%CLOB'
    )
    */
    WITH UR
    

    顺便说一句, 值得仅为字符串列生成 INSERT SELECT 语句,如注释掉的行中所示。
    尽量不要在Db2 for LUW 中使用SYSIBM 架构中的表 - 它们没有记录,并且它们的内容可能会随着一些新版本/修订包而更改,恕不另行通知。请改用 SYSCAT 视图 - 在您的情况下使用 SYSCAT.COLUMNS 视图。

    【讨论】:

    • 谢谢马克。如果我排除 where 条件(其中 column_name like '%-99'),信息代码工作正确,它会从 --loop 表中给出 count(distinct (columns)),但是当我包含 where (where column_name like '%-99' ) 它给出了错误。
    • 抱歉,我没有收到您的评论。您是否尝试过我提供的修改后的(即在您提到的那一行)声明?您现在得到的错误/意外结果是什么?
    • 似乎代码在第一个版本'WHERE'中工作|| COLUMN_NAME || ' LIKE '%-99'',撇号和我在代码中使用的位置存在明显错误。感谢 Mark 的所有活动和帮助。