3

SQL Server 2008 の T-SQL で初めて FOR XML を使用しようとしています。大きなテーブルの列の 1 つで次のエラー メッセージが表示されます。

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 の 16 進数のように見えます = 10 進数の 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 *
FROM (SELECT a = '<'+nchar(2)+'>') x
for xml path(''),type

上記のステートメントでこのエラーが発生します。

XML で許可されていない文字 (0x0002) がノード 'a' に含まれているため、FOR XML はノード 'a' のデータをシリアル化できませんでした。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 に答える