【问题标题】:Query data from a XML column in SQL Server从 SQL Server 中的 XML 列查询数据
【发布时间】:2011-12-22 19:37:40
【问题描述】:

我已将一个对象序列化为我的 SQL Server 2008 数据库中的一个 XML 列。

xml 看起来像这样:

<SimpleUserData xmlns="http://schemas.datacontract.org/2004/07/MyProject.CustomFx.Web" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="1" z:Type="MyProject.CustomFx.Web.SimpleUserData" z:Assembly="MyProject.CustomFx.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
   <BatchDescription z:Id="2">I want this value</BatchDescription>
   <BatchID>9c437c08-0f28-4c77-9a50-49a7a4e8930a</BatchID>
   <BatchTemplateID>And this value too</BatchTemplateID>
</SimpleUserData>

我想编写一个查询来显示元素 BatchDescriptionBatchTemplateID 中的值。

我的查询现在看起来像这样:

declare @xmlobj as xml = '<SimpleUserData xmlns="http://schemas.datacontract.org/2004/07/MyProject.CustomFx.Web" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="1" z:Type="MyProject.CustomFx.Web.SimpleUserData" z:Assembly="MyProject.CustomFx.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
      <BatchDescription z:Id="2">I want this value</BatchDescription>
      <BatchID>9c437c08-0f28-4c77-9a50-49a7a4e8930a</BatchID>
      <BatchTemplateID>And this value too</BatchTemplateID>
    </SimpleUserData>';

select
  @xmlobj.query('
  declare namespace x="http://schemas.datacontract.org/2004/07/MyProject.CustomFx.Web";
(/x:SimpleUserData[1]/x:BatchDescription[1])
') as value1
 ,@xmlobj.query('  
declare namespace x="http://schemas.datacontract.org/2004/07/MyProject.CustomFx.Web";
(/x:SimpleUserData[1]/x:BatchTemplateID[1])
') as value2;

这很接近;它返回整个标签其中的值。

我怎样才能只获得值(即“我想要这个值”和“还有这个值”)

【问题讨论】:

  • 尝试使用 .value 而不是 .query 并带有指定数据类型的第二个参数。
  • 行得通!现在我觉得自己像个经过认证的白痴:) 如果您将此评论作为实际答案,我会支持并接受它。谢谢!

标签: xml sql-server-2008


【解决方案1】:

.query 将始终返回数据类型 XML。

要查询一个值,你应该使用“.value”,并指定数据类型作为第二个参数。

改用这个:

declare @xmlobj as xml = '<SimpleUserData xmlns="http://schemas.datacontract.org/2004/07/MyProject.CustomFx.Web" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="1" z:Type="MyProject.CustomFx.Web.SimpleUserData" z:Assembly="MyProject.CustomFx.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
      <BatchDescription z:Id="2">I want this value</BatchDescription>
      <BatchID>9c437c08-0f28-4c77-9a50-49a7a4e8930a</BatchID>
      <BatchTemplateID>And this value too</BatchTemplateID>
    </SimpleUserData>';

WITH XMLNAMESPACES('http://schemas.datacontract.org/2004/07/MyProject.CustomFx.Web' as x)
select
  @xmlobj.value('(/x:SimpleUserData[1]/x:BatchDescription[1])','nvarchar(max)') as value1
 ,@xmlobj.value('(/x:SimpleUserData[1]/x:BatchTemplateID[1])','nvarchar(max)') as value2;

【讨论】:

  • 您也可以使用WITH XMLNAMESPACES(&lt;uri&gt; AS x) intro 语句来避免在每个@xmlobj.value(..) 调用中声明这些命名空间
  • 很好的建议 - 我已经编辑了答案以包含它,现在它更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2016-07-16
  • 2013-08-18
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多