如何处理' sp_xml_preparedocument'中的无效字符(SQL Server 20188 R2)

时间:2017-03-13 07:24:05

标签: sql xml sql-server-2008

我有一个存储过程,我使用sp_xml_preparedocument来处理XML数据。但由于一些无效的字符,如

<?php 
$json = file_get_contents("php://input");
$obj = json_decode($json);
$response = array();
$response["data1"] = $obj->field1;
$response["data2"] = $obj->field2;
$json_response = json_encode($response);
echo $json_response;``
header("Content-type: application/json");
?>

在XML数据中,SQL抛出异常为#34;在文本内容中可以找到无效字符&#34;。

Screen shot of the exception attached

我的存储过程看起来像

Ex: 1. INGENIERÍA
    2. Engineer'

Sampel XML数据

    DECLARE @idoc INT
    DECLARE @doc XML
    SET @doc = @DocElements -- @Docelements will have XML data
    EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

    SELECT BadgeNo FROM OPENXML (@idoc, '/DocumentElement/PEScoreUpdate',2) WITH(BadgeNo  VARCHAR(50)))AND
    ASRYEAR=YEAR(GETDATE()) And IsPlanDeleted<>1
    EXEC sp_xml_removedocument @idoc 

我从包含数千个数据的Excel工作表中获取此XML数据,因此,实际上无法搜索无效文本并手动更正。 任何人都指导我如何在SQL过程中处理这个无效的char。有没有办法替换这个无效的字符,但我正在处理数以千计的数据。它会影响性能吗? 有人指导我。在此先感谢

1 个答案:

答案 0 :(得分:2)

有一点是,FROM OPENXML(与SP一起准备和删除一个d)已经过时,不应再使用了(很少有例外)。

对于您的实际问题:

我很确定,此问题与FROM OPENXML无关,也与sp_xml_preparedocument无关。你没有展示,你是如何传递XML的。但是 - 可以假设 - 您使用VARCHAR变量(或使用XML-literal)在字符串级别执行此操作。尝试使用NVARCHAR或在文字前放置前导N

如果我是对的,您可以在此处找到详细信息:https://stackoverflow.com/a/42683643/5089204

更新今天如何阅读XML ...

尝试像这样阅读您的XML

DECLARE @doc XML=
N'<DocumentElement>
  <PEScoreUpdate>
    <Badge_x0020_No>105731</Badge_x0020_No>       
    <Last_x0020_Name>Vijaya Kumar</Last_x0020_Name>
    <First_x0020_Name>Sanjay Kumar</First_x0020_Name>
    <BOC>Onshore E&amp;C</BOC>
    <Emp_x0020_Class>White Collar</Emp_x0020_Class>
    <Site>INGENIERÍA PROJECT     Secondment</Site>       
  </PEScoreUpdate>
</DocumentElement>';

SELECT u.value(N'(Badge_x0020_No)[1]',N'int') AS Badge_x0020_No
      ,u.value(N'(First_x0020_Name)[1]',N'nvarchar(max)') AS First_x0020_Name
      ,u.value(N'(BOC)[1]',N'nvarchar(max)') AS BOC
      ,u.value(N'(Emp_x0020_Class)[1]',N'nvarchar(max)') AS Emp_x0020_Class
      ,u.value(N'(Site)[1]',N'nvarchar(max)') AS [Site]
FROM @doc.nodes(N'/DocumentElement/PEScoreUpdate') AS A(u)

更新2

您的代码将/DocumentElement/BasicInformation显示为XPath,但这不会显示在您的XML中?

此外,元素名称中的_x0020_来自Excel列名中的空白。

有几个地方,您的问题可能来自......