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

如何处理“sp_xml_preparedocument”(SQL Server 20188 R2)中的无效字符,sql,xml,sql-server-2008,Sql,Xml,Sql Server 2008,我有一个存储过程,使用sp_xml_preparedocument处理xml数据。但是由于一些无效字符,例如 Ex: 1. INGENIERÍA 2. Engineer' 在XML数据中,SQL抛出异常,因为在文本内容中可以找到无效字符 我的存储过程看起来像 DECLARE @idoc INT DECLARE @doc XML SET @doc = @DocElements -- @Docelements will have XML data EXEC

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

Ex: 1. INGENIERÍA
    2. Engineer'
在XML数据中,SQL抛出异常,因为在文本内容中可以找到无效字符

我的存储过程看起来像

    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 
Sampel XML数据

  <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>
我从包含数千个数据的excel工作表中获取这些XML数据,因此,实际上不可能搜索无效文本并手动更正。 任何人都可以指导我如何在SQL过程中处理这个无效字符。有没有办法替换这个无效字符,但我正在处理成千上万的数据。它会影响性能吗? 谁来指引我。提前感谢

有一点是,从OPENXML和SPs一起准备和删除数据是过时的,不应该使用任何更罕见的例外情况

对于你的实际问题:

我很确定,这个问题与从OPENXML到sp_xml_PreparedDocument都没有关系。您没有显示如何传入XML。但是,可以假设,您可以在字符串级别使用VARCHAR变量或XML文本来执行此操作。尝试使用NVARCHAR或在文本前放置一个前导N

如果我是对的,您可以在这里找到详细信息:

今天更新如何读取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_u来自Excel列名称中的空格

您的问题可能来自多个地方…

有一点是,从OPENXML和SPs一起准备和删除数据是过时的,不应该再使用了。存在任何罕见的例外情况

对于你的实际问题:

我很确定,这个问题与从OPENXML到sp_xml_PreparedDocument都没有关系。您没有显示如何传入XML。但是,可以假设,您可以在字符串级别使用VARCHAR变量或XML文本来执行此操作。尝试使用NVARCHAR或在文本前放置一个前导N

如果我是对的,您可以在这里找到详细信息:

今天更新如何读取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_u来自Excel列名称中的空格


您的问题可能来自几个地方…

我应该如何读取以下格式的xml文件?它只有一个节点,例如,每一行都是这样。@NicholasHumphrey注释不是一个全新问题的最佳位置。。。请开始一个新问题。您可以在评论中放置链接,以提醒可能知道答案的人。。。当然,这样的问题在几分钟内就会得到回答?它只有一个节点,例如,每一行都是这样。@NicholasHumphrey注释不是一个全新问题的最佳位置。。。请开始一个新问题。您可以在评论中放置链接,以提醒可能知道答案的人。。。但毫无疑问,这样的问题将在几分钟内得到回答。