2011-12-22 10 views
1

SQL Server 2008データベースのXML列にオブジェクトをシリアル化しました。SQL Serverの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; 

これは近づく:それはこのようになり、今立っているよう

マイクエリタグのタグ全体が返されます。

にはどうすればいいだけの値(すなわち、「私は、この値をしたい」と「そして、あまりにもこの値」)

+1

は、データ型を指定する二番目のパラメータで代わりに.queryの.VALUE使用してみてください。 –

+0

それは動作します!今私は証明された馬鹿のように感じる:)あなたがこのコメントを実際の答えにするなら、私はupvote&受け入れるでしょう。ありがとう! – JosephStyons

答えて

3

.queryは常にデータ型のXMLを返します得ることができます。

値を照会するには、「.value」を使用し、データ型を2番目のパラメーターとして指定する必要があります。

利用代わりに、この:

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; 
+2

また、 '@ xmlobj.value(..)'の各呼び出しでこれらの名前空間を宣言するのを避けるために、 'WITH XMLNAMESPACES( AS x)'イントロステートメントを使うこともできます。 –

+0

素晴らしい提案 - 私は答えを編集しましたこれを含めると、現在ははるかに読みやすくなります。 – JosephStyons

関連する問題