3

我第一次尝试在 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

4 回答 4

2

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

select * from db.dbo.table where CHARINDEX(CHAR(1), colThatGeneratedError) <> 0
于 2013-09-09T15:11:40.167 回答
0

尝试这个:

 select * from db.dbo.table where (PATINDEX('%[A,Z,0-9]%[A,Z,0-9]%[A,Z,0-9]%',colThatGeneratedError) >0) 
于 2013-09-09T13:17:32.283 回答
0
Select left(youValuCol, ' ')
from yourTable
for xml path ('test')

这个对我有用。可能它是来自 excel 的特殊输入。

于 2014-11-26T13:50:07.750 回答
0
select *
FROM (SELECT a = '<'+nchar(2)+'>') x
for xml path(''),type

对于上述 statemnet,您将收到此错误。

FOR XML 无法序列化节点“a”的数据,因为它包含 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('')))
于 2015-03-27T02:02:45.927 回答