2017-07-05 9 views
0

データ列の下の表にxmlフィールドがありますSQLサーバーのxml値のクエリ

ID |ウェブサイト|以下のデータは

私はテーブル内のすべてのIsCustomer値を取得する必要がXMLフィールド

<Product> 
<field name="IsCustomer" type="System.Boolean, mscorlib"> 
    <boolean>false</boolean> 
    </field> 
</product> 

です。

以下は、これまでに試したコード部分です。

SELECT EMP.ED.value() as EmployeeID 
FROM [dbo].[Products] 
CROSS APPLY Data.nodes('/Product/Field[@Name="IsCustomer"]/Boolean') as EMP(ED) 

誰でもお手伝いできますか?

+0

。それは私の間違いでした。そのSQLサーバー。 –

+0

サンプルXMLを入力とした場合の期待される出力は?ちょうど '偽'? – har07

+0

すべてのフィールド値を別々の列として取得したい。真値と偽値の組み合わせなど。 –

答えて

0

私はすでにXQueryingについての投稿を書いていますが、あなたに役立つでしょう。

注:XQueryingでは大文字と小文字が区別され、正しく配置する必要があります。私はリンクのポストを見て、それが解決しない場合、私はあなたのクエリに関するソリューションでこのコメントを更新します

更新


は、あなたの質問

まず第一に、あなたに答えるために適切にフォーマットされたXMLを持つ必要があります。つまり、タグは大文字と小文字の区別に一致する必要があり、XQueryでタグを参照しているときにも同じルールが適用されます。

だから、解決策の一つは次のようになります。すべての

DECLARE @XML as XML 
SET @XML = '<Product> 
<field name="IsCustomer" type="System.Boolean, mscorlib"> 
    <boolean>false</boolean> 
    </field> 
</Product>' 

SELECT EMP.t.value('boolean[1]','varchar(20)') as EmployeeID 
FROM @XML.nodes('/Product/field') as EMP(t) 
+0

S4V1Nに感謝します。私はそれを確認し、あなたに知らせるでしょう。 –

+0

ようこそスタックオーバーフロー!これは理論的に質問に答えるかもしれませんが、答えの本質的な部分をここに含め、参照のためのリンクを提供することが望ましいです(// meta.stackoverflow.com/q/8259)。 –

+0

私の悪い、私は答えを更新しました。 – S4V1N

2

まず:XMLは厳密に大文字と小文字が区別されます!あなたのXMLは有効でもありません...先頭の<Product>は別の要素名で、その後は</product>です。あなたはすべての場所で小文字を使用しているように、私はこのように変更しました。

独自のクエリは近いですが、大文字で間違っていて、.value()関数を正しく使用していません(パラメータが不足しています)。

このお試しください:

DECLARE @mockup TABLE(ID INT IDENTITY,Descr VARCHAR(100),Data XML); 
INSERT INTO @mockup VALUES 
('Your Sample','<product> 
<field name="IsCustomer" type="System.Boolean, mscorlib"> 
    <boolean>false</boolean> 
    </field> 
</product>') 
,('Your sample plus another field','<product> 
<field name="IsCustomer" type="System.Boolean, mscorlib"> 
    <boolean>true</boolean> 
    </field> 
<field name="SomeOther" type="System.Boolean, mscorlib"> 
    <boolean>true</boolean> 
    </field> 
</product>') 
,('No "IsCustomer" at all','<product> 
<field name="SomeOther" type="System.Boolean, mscorlib"> 
    <boolean>true</boolean> 
    </field> 
</product>') 
,('Two of them','<product> 
<field name="IsCustomer" type="System.Boolean, mscorlib"> 
    <boolean>true</boolean> 
    </field> 
<field name="IsCustomer" type="System.Boolean, mscorlib"> 
    <boolean>false</boolean> 
    </field> 
</product>'); 

SELECT * FROM @mockup; 

--Your様々なバリエーションを返すクエリを、そのうちの一つがあなたのために大丈夫でなければなりません。申し訳ありません

SELECT m.ID 
     ,m.Descr 
     ,fld.value('(boolean/text())[1]','bit') 
FROM @mockup AS m 
OUTER APPLY m.Data.nodes('/product/field[@name="IsCustomer"]') AS A(fld);