【问题标题】:CONVERTING SQL NVARCHAR(MAX) TO XML and getting a Value from XML string将 SQL NVARCHAR(MAX) 转换为 XML 并从 XML 字符串中获取值
【发布时间】:2015-04-29 23:34:52
【问题描述】:

我正在尝试从存储 XML 字符串的列的节点中读取。该列的类型为 NVARCHAR(MAX)。

以下是创建表的脚本 - 设置 ANSI_NULLS ON 去吧

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[XML_Dummy](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [XMLValue] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

以下是向其输入值的脚本 -

INSERT INTO [dbo].[XML_Dummy]
           ([Name]
           ,[XMLValue])
     VALUES
           ('abcd'
           ,'<?xml version="1.0" encoding="UTF-8"?>
            <STAFFv xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                 <EMPLOYEE_NUMBER>123456</EMPLOYEE_NUMBER>
                <TITLE>Mr</TITLE>
                <INITIALS>J</INITIALS>
                <FORENAME>PEARL</FORENAME>
                <SURNAME>HOFFMAN</SURNAME>
                <GENDER>MALE</GENDER>
                <DATE_OF_BIRTH>1992-01-01</DATE_OF_BIRTH>
                  <DEPARTMENT_DESC>SUPER SUPPORT TEAM</DEPARTMENT_DESC>
                  <JOB_TITLE_DESC>GENERAL DOGSBODY</JOB_TITLE_DESC>
                  <ORIGINAL_DATE_JOINED>2014-05-01</ORIGINAL_DATE_JOINED>
                  <CURRENT_EMPLOYEE financialyear="2014">Y</CURRENT_EMPLOYEE>
                  <INTERNAL_EMAIL xsi:nil="true" />
                  <CHANGE_TYPE>INSERT</CHANGE_TYPE>
                  <CHANGE_DATE>2014-03-27</CHANGE_DATE>
            </STAFF>')
GO

我的目标是从此字符串中获取 GENDER。 但是,当我编写以下查询时开始 -

     declare @XMLVALUECAST_ xml
    declare @XMLVALUECONVERT_ xml

 SELECT 
         @XMLVALUECAST_ = CAST(XMLValue AS XML),
         @XMLVALUECONVERT_ = CONVERT(XML, XMLValue)

      --CAST(CAST(CAST(XMLValue AS NTEXT) AS XML).query('data(/STAFF/GENDER)') AS VARCHAR(10)) AS Gender 
 FROM  
    [dbo].[XML_Dummy]

    print @XMLVALUECAST_
    PRINT @XMLVALUECONVERT_

我得到错误 - 消息 9402,第 16 层,状态 1,第 3 行 XML解析:第1行,第38个字符,无法切换编码。

我使用的是 SQL Server 2012 (11.0.5058.0)

【问题讨论】:

    标签: sql-server xml-parsing


    【解决方案1】:

    首先,为什么不将列保存在 XML 中?另一件事是标签中有错误。我相信它应该是 STAFF,而不是 STAFFv。最后一件事是使用 UTF-8 而不是 UTF-16 进行 XML 编码。所以最终的代码是:

    CREATE TABLE #XML_Dummy
        (
          [ID] [INT] IDENTITY(1, 1)
                     NOT NULL ,
          [Name] [NVARCHAR](50) NULL ,
          [XMLValue] [NVARCHAR](MAX) NULL
        ); 
    
    INSERT  INTO #XML_Dummy
            ( [Name] ,
              [XMLValue]
            )
    VALUES
            ( 'abcd' ,
              '<?xml version="1.0" encoding="UTF-8"?>
                <STAFF xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                     <EMPLOYEE_NUMBER>123456</EMPLOYEE_NUMBER>
                    <TITLE>Mr</TITLE>
                    <INITIALS>J</INITIALS>
                    <FORENAME>PEARL</FORENAME>
                    <SURNAME>HOFFMAN</SURNAME>
                    <GENDER>MALE</GENDER>
                    <DATE_OF_BIRTH>1992-01-01</DATE_OF_BIRTH>
                      <DEPARTMENT_DESC>SUPER SUPPORT TEAM</DEPARTMENT_DESC>
                      <JOB_TITLE_DESC>GENERAL DOGSBODY</JOB_TITLE_DESC>
                      <ORIGINAL_DATE_JOINED>2014-05-01</ORIGINAL_DATE_JOINED>
                      <CURRENT_EMPLOYEE financialyear="2014">Y</CURRENT_EMPLOYEE>
                      <INTERNAL_EMAIL xsi:nil="true" />
                      <CHANGE_TYPE>INSERT</CHANGE_TYPE>
                      <CHANGE_DATE>2014-03-27</CHANGE_DATE>
                </STAFF>'
            );
    
    SELECT
        b.x.value('/STAFF[1]/GENDER[1]', 'varchar(100)')
    FROM
        #XML_Dummy a
        CROSS APPLY (
                      SELECT
                       CAST(CAST ([XMLValue] AS VARCHAR(MAX)) AS XML) x
                    ) b;
    DROP TABLE #XML_Dummy;
    

    【讨论】:

    • 感谢您的回复 - 1. 首先对标签错误表示抱歉,这是在复制和粘贴时出现的拼写错误。 2. 数据库来自现有系统,我现在无法更改数据类型。 3. UTF 也是如此。现有数据以 UTF-8 保存。 UTF -8 和 NVARCHAR (Max) 有什么办法吗?
    【解决方案2】:

    我认为您的 XML 字符串无效。 STAFF 的开始标签末尾有一个字母“v”:

    <STAFFv xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    

    要获取性别值,您可以像这样选择它:

    SELECT @XMLVALUECAST_.value('/*[1]/GENDER[1]','varchar(100)')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多