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 标头名称无效