将 SQL NVARCHAR(MAX) 转换为 XML 并从 XML 字符串中获取值 [英] CONVERTING SQL NVARCHAR(MAX) TO XML and getting a Value from XML string

查看:23
本文介绍了将 SQL NVARCHAR(MAX) 转换为 XML 并从 XML 字符串中获取值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying read from the nodes of a column -where an XML string is stored. The column is of type NVARCHAR(MAX).

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

The following is the script to create table - SET ANSI_NULLS ON GO

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

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

The following is the script to enter values to it -

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.但是,当我编写以下查询时开始 -

My goal is to get the GENDER from this string. However to start with when I am writing the following query -

     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个字符,无法切换编码.

I get the error - Msg 9402, Level 16, State 1, Line 3 XML parsing: line 1, character 38, unable to switch the encoding.

我使用的是 SQL Server 2012 (11.0.5058.0)

I am using SQL Server 2012 (11.0.5058.0)

推荐答案

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

First of all why don't you save the column in XML? Another thing that you have error in the tag. I believe that it is supposed to be STAFF, not STAFFv. And the last thing is that UTF-8 is used instead of the UTF-16 for XML encoding. So the final code is:

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;

这篇关于将 SQL NVARCHAR(MAX) 转换为 XML 并从 XML 字符串中获取值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆