【问题标题】:Reading XML data from SQL Server with Hear and Node values使用 Hear 和 Node 值从 SQL Server 读取 XML 数据
【发布时间】:2018-12-19 05:34:50
【问题描述】:

我在文件“Test1.xml”中有以下 XML 数据:

<TextValuess>
 <TextValues Name="Value1" Override="true" Type="String">
  <DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
  <INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
  <INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
  <INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
 </TextValues>
 <TextValues Name="ENVIRONMENT" Override="true" Type="String">
  <DEV>DEV</DEV>
  <INT10>INT10</INT10>
  <INT>INT1</INT>
  <INT2>INT15</INT2>
 </TextValues>
</TextValuess>

我正在尝试读取 &lt;TextValues&gt; 标签的 INT10 值和名称。我需要 SQL Server 中的如下输出:

Name               Value
----               -----
Value1             LAB
Environment        INT10

我已经尝试过使用这些 SQL 语句。我能够获得Name 值或INT10 值。

声明 1:

select c3.value('INT10[1]','varchar(50)')
from
    (select cast(c1 as xml)
     from OPENROWSET (BULK 'D:\Tasks\Test1.xml',SINGLE_BLOB) as T1(c1)) as T2(c2)
cross apply c2.nodes('/TextValuess/TextValues') T3(c3)

这样我就能够检索到 INT10 的值

声明 2:

 DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

 SELECT @XML = ' <TextValuess>
 <TextValues Name="Value1" Override="true" Type="String">
  <DEV>Source=DEV;Catalog=DEV_DMT;Integrated Security=SSPI;</DEV>
  <INT10>Source=LAB;Catalog=TST_INT10;Integrated Security=SSPI;</INT10>
  <INT>Source=LAB1;Catalog=TST_INT1;Integrated Security=SSPI;</INT>
  <INT2>Source=LAB10;Catalog=TST_INT12;Integrated Security=SSPI;</INT2>
 </TextValues>
 <TextValues Name="ENVIRONMENT" Override="true" Type="String">
  <DEV>DEV</DEV>
  <INT10>INT10</INT10>
  <INT>INT1</INT>
  <INT2>INT15</INT2>
 </TextValues>
</TextValuess>'

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT Name ,INT10
FROM OPENXML(@hDoc, 'TextValuess/TextValues/INT10')
WITH 
(
Name [varchar](50) '../@Name',
INT10 [varchar](100) '../@INT10'
)

这样,我只能检索名称信息,但不能检索 INT10 值。

【问题讨论】:

    标签: sql-server xml sqlxml


    【解决方案1】:

    试试这个代码:

    -- declare a XML variable
    DECLARE @XmlInput XML;
    
    -- load the XML from the file into that XML variable
    SELECT @XmlInput = CAST(c1 AS XML)
    FROM OPENROWSET (BULK 'D:\Tasks\Test1.xml',SINGLE_BLOB) AS T1(c1)
    
    -- extract the "Name" attribute and "INT10" element from the XML    
    SELECT
        Name = XC.value('@Name', 'varchar(50)'),
        Int10Value = XC.value('(INT10)[1]', 'varchar(100)')
    FROM    
        @XmlData.nodes('/TextValuess/TextValues') AS XT(XC)
    

    使用内置的、更受欢迎的 XQuery 功能调用 .nodes()(转储 OPENXML 的东西 - 它是旧的和遗留的并且有内存泄漏 - XQuery 也更容易使用!)返回一个列表XML 片段 - 一个用于文档中 XPath 表达式的每个匹配项(此处:一个用于根下的每个 &lt;TextValues&gt; 节点)。

    然后您进入该 XML 片段,提取名称 attribute(使用 @Name 表达式)和第一个(也是唯一的)&lt;INT10&gt; 子元素并将它们转换为“常规”值(具有由.value() 调用的第二个参数定义的数据类型)

    【讨论】:

    • 谢谢它的工作 :) 查询所需的一个更正似乎是在语句最后一行的 from 子句之后,它与“@xmlData”而不是“@XmlInput”错位。
    • 非常感谢您的详细解释。
    • Marc_S - 对不起。我已经接受了这个作为答案。不知道为什么它没有显示我的接受?我可能点击了两次?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2016-08-18
    相关资源
    最近更新 更多