FOR XML无法为节点序列化数据,因为它包含XML中不允许的字符(0x0001)

时间:2013-09-09 13:11:53

标签: sql-server tsql

我正在尝试在SQL Server 2008上的T-SQL中第一次使用FOR XML。我收到了我的大表中其中一列的错误消息:

FOR XML could not serialize the data for node because it contains a character (0x0001) which is not allowed in XML. To retrieve this data using FOR XML, convert it to binary, varbinary or image data type and use the BINARY BASE64 directive.

我猜了一下并尝试了这个:

select * from db.dbo.table where colThatGeneratedError like '%0x0001%'

但它没有任何行。

如何找出表中哪些行包含无效字符?

0x0001指的是什么字符?我的眼睛看起来像十六进制1 =十进制1

4 个答案:

答案 0 :(得分:2)

在TSQL中,您可以使用CHAR函数,例如

select * from db.dbo.table where CHARINDEX(CHAR(1), colThatGeneratedError) <> 0

答案 1 :(得分:0)

试试这个:

 select * from db.dbo.table where (PATINDEX('%[A,Z,0-9]%[A,Z,0-9]%[A,Z,0-9]%',colThatGeneratedError) >0) 

答案 2 :(得分:0)

Select left(youValuCol, ' ')
from yourTable
for xml path ('test')

它对我有用。可以说它是excel的特殊输入。

答案 3 :(得分:0)

select *
FROM (SELECT a = '<'+nchar(2)+'>') x
for xml path(''),type

您将在上述statemnet中收到此错误。

  

FOR XML无法序列化节点&#39; a&#39;因为它包含   XML中不允许的字符(0x0002)。要检索这个   使用FOR XML的数据,将其转换为二进制,varbinary或图像数据类型   并使用BINARY BASE64指令。

我已经创建了一个sql函数来解决这个问题

USE master;
GO
IF (OBJECT_ID('str_to_xml') IS NOT NULL) DROP FUNCTION dbo.str_to_xml;
GO
CREATE FUNCTION dbo.str_to_xml(@input AS nvarchar(max))
RETURNS xml
BEGIN
    DECLARE @i int, @iText nvarchar(100);
    SET @i = 0x0;
    WHILE (@i <= 0x8)
    WHILE (@i <= 0xFFFF)
    BEGIN
        SET @iText = master.dbo.fn_varbintohexstr(@i);
        SET @iText = ISNULL(STUFF(@iText, 1, PATINDEX('%[^0x]%', @iText) - 1, ''), '0');
        SET @iText = '&#x' + CASE WHEN LEN(@iText) > 1 THEN '' ELSE '0' END + @iText + ';';
        SET @input = REPLACE(@input, @iText, '');
        SET @i = CASE
            WHEN @i + 1 BETWEEN 0x9 AND 0xA THEN 0xA
            WHEN @i + 1 = 0xD THEN 0xD
            WHEN @i + 1 BETWEEN 0x20 AND 0xD7FF THEN 0xD7FF
            WHEN @i + 1 BETWEEN 0xE000 AND 0xFFFD THEN 0xFFFD
            ELSE @i + 1 END + 1;
    END
    RETURN CONVERT(xml, @input);
END
GO

用法:

select master.dbo.str_to_xml((select *
FROM (SELECT a = '<'+nchar(2)+'>') x
for xml path('')))