我正在尝试为插入存储过程读取中文,XML读取SP将批量输入参数作为XML,然后使用“sp_xml_preparedocument”解析/读取它并插入表中。这里的问题是它正在读中文为“???”字符。
下面是xml阅读SP:
DECLARE @idoc int;
DECLARE @cnt int = 0;
EXEC sp_xml_preparedocument @idoc OUTPUT, '<?xml version="1.0" encoding="ISO-8859-1"?><DocumentElement><Specifications><ID>1</ID><Name>维</Name><Value>123</Value></Specifications><Specifications><ID>2</ID><Name>重量</Name><Value>123123</Value></Specifications></DocumentElement>'
SELECT @cnt = COUNT(*)
SELECT ID, Name, Value
FROM OPENXML (@idoc, '/DocumentElement/Specifications', 2)
WITH (ID int, Name nvarchar(MAX), Value nvarchar(MAX))
输出是: -
ID Name Value
1 ? 123
2 ?? 123123
你可以看到Name就像汉字一样。我尝试将XML编码更改为UTF-8和UTF-16,但没有运气。
答案 0 :(得分:2)
您能否以UTF-16而非ISO-8859-1展示文件?以下工作正常:
DECLARE @xml XML = N'<?xml version="1.0" ?><DocumentElement><Specifications><ID>1</ID><Name>维</Name><Value>123</Value></Specifications><Specifications><ID>2</ID><Name>重量</Name><Value>123123</Value></Specifications></DocumentElement>'
SELECT x.value(N'ID[1]', 'int') as ID,
x.value(N'Name[1]', 'nvarchar(max)') as Name,
x.value(N'Value[1]', 'nvarchar(max)') as Value
FROM @xml.nodes (N'/DocumentElement/Specifications') T(x);
请参阅SqlFiddle。
答案 1 :(得分:1)
首先,需要使用N''
将XML定义为Unicode字符串。
其次,SQL Server的XML处理不允许encoding
属性发出错误
消息6602,级别16,状态2,过程sp_xml_preparedocument,第1行 错误描述是'从当前编码切换到指定 编码不受支持。'。
我想这个论点是,当SQL Server将UCS-2用于NVARCHAR时,不能有任何其他编码。
修复这两个错误将为您提供所需的结果。
答案 2 :(得分:0)
将变量声明为XML解决了我的问题。
在解析“Käufergarantierte”的角色时,对sp_xml_preparedocument的调用失败。将编码设置为UTF-16会引发错误“从当前编码切换到不支持的指定编码”。我将XML字符串作为参数从C#代码传递为NVARCHAR(MAX)。