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('')))