字符串中的“→”导致错误“在 SQL/XML 表达式中发现非法 XML 字符 001A”(DB2)

Posted

技术标签:

【中文标题】字符串中的“→”导致错误“在 SQL/XML 表达式中发现非法 XML 字符 001A”(DB2)【英文标题】:"→" in string is causing error "Illegal XML character 001A was found in an SQL/XML expression" (DB2) 【发布时间】:2022-01-11 16:38:55 【问题描述】:

我需要合并数据库中的多行,为此我需要删除一些特定字符。我使用以下代码:

  REPLACE(
        (CAST(XMLSERIALIZE(XMLAGG(XMLTEXT(
              CONCAT(RTNTXT.LIN_TX,'')
                                         )
                                 ) AS CLOB(10024)
                          ) AS VARCHAR(402)
             )
        ),'
',''
        )  AS NARRATIVE

一旦在我签名的任何<mystring> 记录中→,我的查询就会显示有关非法 XML 字符 001A 的警告。

我尝试使用一些谷歌建议并将代码转换为:

  REPLACE(
        (CAST(XMLSERIALIZE(XMLAGG(XMLTEXT(
              CONCAT(RTNTXT.LIN_TX,'')
                                         )
                                 ) AS CLOB(10024)
                          ) AS VARCHAR(402)
             )
        ),x'1A',''
        )  AS NARRATIVE

但错误仍然存​​在。

你能告诉我我可以在语法中修改什么以使其正常工作吗?

【问题讨论】:

RTNTXT.LIN_TX 列的确切 Db2-column-datatype 是什么? 什么是数据库代码页和平台?您尝试应用的逻辑是什么? 【参考方案1】:

您必须在将字符串传递给 XML 函数之前从字符串中删除非法 XML 字符。 考虑以下示例。如果您取消注释已注释掉的字符串,您将获得 SQLCODE=-20377 以及您提到的类似文本。请注意,“→”字符没有问题。问题出在 x'1A' 上。

WITH MYTAB (LIN_TX) AS 
(
VALUES 
  'abc→abc'
, 'xyz' || x'1a' || 'xyz'
)
SELECT
  XMLSERIALIZE (XMLAGG (XMLTEXT (REGEXP_REPLACE (LIN_TX, '\x1A', ''))) AS VARCHAR (402)) AS CORRECT
--, XMLSERIALIZE (XMLAGG (XMLTEXT (LIN_TX)) AS VARCHAR (402)) AS INCORRECT
FROM MYTAB

【讨论】:

以上是关于字符串中的“→”导致错误“在 SQL/XML 表达式中发现非法 XML 字符 001A”(DB2)的主要内容,如果未能解决你的问题,请参考以下文章

从 LPTSTR 到 tstring 的转换会导致运行时错误

es6 类函数中的 this[functionName] 导致“元素隐式具有 'any' 类型,因为字符串类型的表达式不能用于索引”

正则表达式模式修饰符

实现 GROUP BY oracle 查询导致:不是 Ruby 中的 GROUP BY 表达式

为啥这个表达式会导致浮点错误?

导致表达式语法错误的 mov 指令