【问题标题】:How to parse XML using SP_XML_PREPAREDOCUMENT for UTF-8 in SQL Server如何在 SQL Server 中使用 SP_XML_PREPAREDOCUMENT 为 UTF-8 解析 XML
【发布时间】:2021-12-30 11:16:21
【问题描述】:

这是主要程序:

ALTER PROCEDURE [dbo].[GHA_SAP_GetResponseXML]
    @xmlINVDetails ntext
AS 
BEGIN
    DECLARE @XMLData XML, @DatVal nvarchar(max),
            @authenticationCode varchar(500), @messageId varchar(50)

    SELECT @DatVal = @xmlINVDetails

    SELECT @XMLData = SUBSTRING(@DatVal, CHARINDEX('>', @DatVal) + 1, LEN(@DatVal))

    SELECT 
        @authenticationCode = Node.Data.value('(authenticationCode)[1]', 'VARCHAR(MAX)'),
        @messageId = Node.Data.value('(messageId)[1]', 'VARCHAR(MAX)')
    FROM
        @XMLData.nodes('/BASSAPRequest') Node(Data) 
    
    DECLARE @intPointer int
    
    DECLARE @tblFSU Table
                    (
                         [Month] varchar(5), 
                         [Year] INT, 
                         InvType varchar(10)
                    )

    EXEC SP_XML_PREPAREDOCUMENT @intPointer output, @xmlINVDetails

    INSERT INTO @tblFSU ([Month], [Year], InvType)
        SELECT [Month], [Year], InvType             
        FROM OPENXML (@intPointer, 'BASSAPRequest', 2)   
             WITH (
                      [Month] varchar(5), 
                      [Year] INT, 
                      InvType varchar(10)
                  )
  
    --select * from @tblFSU

    IF OBJECT_ID('tempdb..#temp') IS NOT NULL 
        DROP TABLE #FSU_FOR_XML

    DECLARE @month int, @year int,@invoType varchar(10), 
            @FSUCount bigint, @Airline_code varchar(2)

    SELECT @month = [Month] FROM @tblFSU
    SELECT @year = [Year] FROM @tblFSU
    SELECT @invoType = invType FROM @tblFSU
END

当我执行这个过程时,我得到这个错误:

GHA_SAP_GetResponseXML
'<?xml version="1.0" encoding="UTF-8"?>
<BASSAPRequest>
  <InvType>036</InvType>
  <Year>2021</Year>
  <Month>03</Month>
</BASSAPRequest>'

我收到以下错误:

XML 解析错误 0xc00ce56f 发生在第 1 行,靠近 XML 文本“”

消息 6602,级别 16,状态 2,过程 sp_xml_preparedocument,第 27 行
错误描述为“不支持从当前编码切换到指定编码。”。

消息 8179,级别 16,状态 5,过程 GHA_SAP_GetResponseXML,第 51 行
找不到句柄为 0 的准备好的语句。

【问题讨论】:

  • 你为什么在这里使用SP_XML_PREPAREDOCUMENT 而不仅仅是XQuery?
  • 如果您使用nvarchar(max) 输入参数,那么为什么它仍然有encoding="UTF-8"?好像你需要修复你的 XML。
  • 我需要做什么。请帮帮我。
  • 您最好解释一下您实际上想要达到的目标。示例数据和预期结果将帮助我们为您提供帮助。
  • 我已编辑请检查

标签: sql-server xml-parsing


【解决方案1】:

不清楚为什么您使用ntext 而不是nvarchar(max),如果您有UTF-8 XML,为什么不使用带有UTF-8 排序规则的varchar,以及为什么您要尝试选择不使用的节点'不存在。

尽管如此,我建议您避免使用openxml 和相关程序,而只使用.nodes.value

CREATE OR ALTER PROCEDURE [dbo].[GHA_SAP_GetResponseXML]
  @xmlINVDetails nvarchar(max)
AS

SELECT
  authenticationCode = Node.Data.value('(authenticationCode/text())[1]', 'varchar(max)'),
  messageId          = Node.Data.value('(messageId/text())[1]', 'varchar(max)'),
  Month              = Node.Data.value('(Month/text())[1]', 'varchar(5)'),
  Year               = Node.Data.value('(Year/text())[1]', 'int'),
  InvType            = Node.Data.value('(InvType/text())[1]', 'varchar(10)')
FROM (VALUES( CAST(CAST(@xmlINVDetails COLLATE Latin1_General_100_BIN2_UTF8 AS varchar(max)) AS xml) )) v(XmlData)
CROSS APPLY v.XmlData.nodes('/BASSAPRequest') Node(Data);

db<>fiddle

结果:

authenticationCode messageId Month Year InvType
null null 03 2021 036

【讨论】:

  • 当我使用 varchar(max) 而不是 nvarchar(max) 时,我的错误就解决了。
  • 确实如此,但你仍然不应该使用openxml
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2018-11-17
  • 2020-01-20
  • 2015-11-18
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多