0

我正在尝试通过使用对其他列进行分组来连接 1 列数据,XMLAGG()但我面临 XML 错误数据问题。

SQL错误:

在 SQL/XML 表达式或函数参数中发现非法 XML 字符“001A”

这是我的查询:

SELECT FIRSTNAME, LASTNAME, EMAIL_ID, VNDR_ID,
CASE WHEN (TEXTPREVIEW > ' ') 
 THEN 
substr(xmlserialize(Xmlagg(Xmltext(Concat(', ',Trim( TEXTPREVIEW)))) as clob), 3) 
END AS Notes
from CONTACT_ETL_NOTE_TABLE
where TEXTPREVIEW <> ''
GROUP BY FIRSTNAME, LASTNAME, EMAIL_ID, VNDR_ID,TEXTPREVIEW 

我怎样才能避免这个错误?

4

1 回答 1

2

如果数据小于 32K,您最好使用LISTAGG

但是如果您只需要删除字节序列 x'001A',那么您可以使用REGEXP_REPLACE它(取决于您的 Db2 版本)。

SELECT FIRSTNAME, LASTNAME, EMAIL_ID, VNDR_ID
,   CASE WHEN (TEXTPREVIEW > ' ') 
         THEN substr(xmlserialize(Xmlagg(Xmltext(Concat(', ',Trim(
      REGEXP_REPLACE(TEXTPREVIEW,'\x00\x1A','') )))) as clob), 3) END AS Notes 
from
    CONTACT_ETL_NOTE_TABLE
where
    TEXTPREVIEW <> ''
GROUP BY
    FIRSTNAME, LASTNAME, EMAIL_ID, VNDR_ID,TEXTPREVIEW 

或者001A可能是 UTF-16,在 UTF-8 中你实际上有一个UTF-8: 0x1Athen 你可能只需要REGEXP_REPLACE(TEXTPREVIEW,'x1A',''). 所以也许检查你有什么字节导致了这个问题。请注意,XML 不允许 x00-x1F 控制字符(尽管 Unicode 对它们很好......看图)

于 2019-06-11T21:27:14.663 回答