从SQL Server中的XML列查询数据

从SQL Server中的XML列查询数据,xml,sql-server-2008,Xml,Sql Server 2008,我已将一个对象序列化到SQLServer2008数据库中的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:

我已将一个对象序列化到SQLServer2008数据库中的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>
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;
这很接近;它返回整个标记和其中的值


如何仅获取值(即“我想要这个值”和“还有这个值”)

。查询将始终返回数据类型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;
将@xmlobj声明为xml=
我想要这个值
9c437c08-0f28-4c77-9a50-49a7a4e8930a
还有这个值
';
使用XMLNAMESPACES('http://schemas.datacontract.org/2004/07/MyProject.CustomFx.Web'作为x)
选择
@xmlobj.value(“(/x:SimpleUserData[1]/x:BatchDescription[1]),“nvarchar(max)”作为值1
,@xmlobj.value('(/x:SimpleUserData[1]/x:BatchTemplateID[1]),'nvarchar(max')作为值2;

尝试使用.value而不是.query,使用第二个参数指定数据类型。这很有效!现在我觉得自己像一个合格的白痴:)如果你把这句话作为一个真实的答案,我会投票并接受它。谢谢您还可以将
与XMLNAMESPACES(AS x)
intro语句结合使用,以避免在每个
@xmlobj.value(…)
callGreat suggestion中声明这些名称空间-我已经对答案进行了编辑,将其包括在内,现在可读性更强。