AS400 - 令牌“!”无效

Posted

技术标签:

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

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

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

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

这是否发生在某人身上?

最好的问候。

【问题讨论】:

【参考方案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 可以工作时,为什么 避免它呢?跨度>

以上是关于AS400 - 令牌“!”无效的主要内容,如果未能解决你的问题,请参考以下文章

来自 QSYS2.SysTables 的查询返回错误“令牌;无效”

加载操作中的 BigQuery 错误:令牌无效 - 令牌无效:无状态令牌已过期

Python 请求 POST DATA 错误 400 标头名称无效

Spotify Web Api 令牌请求响应 400

令牌无效错误:指定的令牌无效:无法读取未定义的属性“替换”?

Spring Security JWT - 400 错误请求:“无效授权”“错误凭据”