【问题标题】:AS400 - Token "!" not validAS400 - 令牌“!”无效
【发布时间】:2020-04-22 09:44:33
【问题描述】:

我正在使用 RUNSQL 在 CL 程序中运行 SQL 查询。此查询是基本的 SELECT 语句,并使用感叹号连接字符串。

多年来,直到昨天,它运行良好。现在,不知从何而来,我收到了一条 SQL0104 消息,显示 Token '!'每次运行程序时都无效

如果我使用 STRSQL 手动运行查询,它可以工作。

这是否发生在某人身上?

最好的问候。

【问题讨论】:

    标签: sql string db2 ibm-midrange db2-400


    【解决方案1】:

    DB2 的字符串连接运算符实际上是双管道||

    documentation says:

    使用连接运算符 (||) 将表达式的两个值连接成一个字符串。在某些非英文单字节字符集中,|| 可以显示为!!(感叹号)或其他特殊字符。

    因此,您的问题可能是由于客户端字符集的更改引起的。只需使用标准运算符,您的代码就可以正常工作。

    【讨论】:

    • 或者,为了在不同的 RDBMS 之间实现更好的可移植性,请使用 CONCAT 运算符,如 Db2 for i 文档中的建议ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/db2/…
    • @mao 。 . .如果您想要兼容性,为什么不使用标准 SQL 运算符?这听起来不像是真正合理的建议。
    • @GordonLinoff - 全球现代系统中更便携的“标准”运算符是 CONCAT。使用管道字符的问题是国际化。请记住,很大一部分 Db2 实例位于 EBCDIC 平台上,当您涉及不同编码之间的转换时,您宝贵的管道字符可能会发生不好的事情。
    • @JohnY 。 . .有 SQL 标准委员会。 “标准”不是抽象的,|| 是标准的字符串连接运算符。支持concat() 的数据库数量与支持|| 的数据库数量相当——其中包括Oracles 对函数的两个参数形式的支持。
    • @GordonLinoff - 与实际数据库实现相比,“SQL 标准”是一个正式定义,因此抽象的/i>。我认为我们大多数人,尤其是以数据库为生的人,都是务实的人。如果 CONCAT 更有可能实际工作,那么您为什么使用它?如果您知道 CONCAT 不适用于您需要支持的特定数据库,那当然是另一回事了。管道字符是 Db2 的已知且记录在案的问题点,那么当您知道 CONCAT 可以工作时,为什么 避免它呢?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2021-08-21
    • 2021-04-13
    相关资源
    最近更新 更多