我有一个存储过程,我使用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;。
我的存储过程看起来像
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。有没有办法替换这个无效的字符,但我正在处理数以千计的数据。它会影响性能吗? 有人指导我。在此先感谢
答案 0 :(得分:2)
有一点是,FROM OPENXML
(与SP一起准备和删除一个d)已经过时,不应再使用了(很少有例外)。
对于您的实际问题:
我很确定,此问题与FROM OPENXML
无关,也与sp_xml_preparedocument
无关。你没有展示,你是如何传递XML的。但是 - 可以假设 - 您使用VARCHAR
变量(或使用XML-literal)在字符串级别执行此操作。尝试使用NVARCHAR
或在文字前放置前导N
。
如果我是对的,您可以在此处找到详细信息:https://stackoverflow.com/a/42683643/5089204
尝试像这样阅读您的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&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)
您的代码将/DocumentElement/BasicInformation
显示为XPath
,但这不会显示在您的XML中?
此外,元素名称中的_x0020_
来自Excel列名中的空白。
有几个地方,您的问题可能来自......