2017-08-23 13 views
0

私は何十件もの投稿を読んだことがあります。残念ながら、私はSQLのエキスパートではなく(初心者でもない)、XML専門家でもありません。私はSQLからの基本的なクエリを理解しており、主にXMLタグを理解しています。SQL Serverデータベースから列をXMLに抽出する

私はデータベーステーブルを照会しようとしており、データにXMLを含む列の値のリストを表示しようとしています。私はあなたにデータの例を挙げます。私は試したことすべてであなたを負担しません。

ここでは、必要な列の内部のフィールドの例を示します。だからこれは単なる行です、私は必要なすべてのデータを取得するためにテーブル全体を照会する必要があります。

[テーブル名]から*を選択すると何百もの行が返され、1行の 'ドキュメント'の列名をダブルクリックすると必要な情報が得られます。

それは次のようになります。

Code  Description 
-------------------- 
(Data) (Data) 

任意のアイデア:それはテーブルの上にクエリを実行し、このような結果を生成するよう

<code_set xmlns=""> 
    <name>ExampleCodeTable</name> 
    <last_updated>2010-08-30T17:49:58.7919453Z</last_updated> 
    <code id="1" last_updated="2010-01-20T17:46:35.1658253-07:00" 
      start_date="1998-12-31T17:00:00-07:00" 
      end_date="9999-12-31T16:59:59.9999999-07:00"> 
     <entry locale="en-US" name="T" description="Test1" /> 
    </code> 
    <code id="2" last_updated="2010-01-20T17:46:35.1658253-07:00" 
      start_date="1998-12-31T17:00:00-07:00" 
      end_date="9999-12-31T16:59:59.9999999-07:00"> 
     <entry locale="en-US" name="Z" description="Test2" /> 
    </code> 
    <displayExpression>[Code] + ' - ' + [Description]</displayExpression> 
    <sortColumn>[Description]</sortColumn> 
</code_set> 

理想的には、私はそれを書くのでしょうか?それも可能ですか?私が試した何十ものものは常にスタックに入れられ、ヌルを返すか、失敗します。次のクエリは、すべての行でXMLフィールドを読み込みますあなたの助け

おかげ

+0

xmlノードの値の一部を取得し、その値を表形式の結果セットのフィールドとして使用する場合は、右ですか?どちらのノードを使いたいですか? –

+0

@ViKiNG OPが単一のXML文書だけでなく、クエリによって返されたすべての行に対して[xmlフィールド]を細断したいので、重複しているとは思わない。 –

答えて

0

は、その後、表形式の結果セットに特定の値を細断処理しました。

SELECT 
     -- get attribute [attribute name] from the parent node 
     parent.value('./@attribute name','varchar(max)') as ParentAttributeValue, 
     -- get the text value of the first child node 
     child.value('./text()', 'varchar(max)') as ChildNodeValueFromFirstChild, 
     -- get attribute attribute [attribute name] from the first child node 
     child.value('./@attribute name', 'varchar(max)') as ChildAttributeValueFromFirstChild 
FROM 
    [table name] 
     CROSS APPLY 
    -- create a handle named parent that references that <parent node> in each row 
    [xml field name].nodes('//xpath to parent name') AS ParentName(parent) 
    CROSS APPLY 
    -- create a handle named child that references first <child node> in each row 
    parent.nodes('(xpath from parent/to child)[0]') AS FirstChildNode(child) 
GO 

もっと正確な答えを得るために、XMLからシュレッドしたい正確な値を入力してください。

1

はこのような何かを試してみてください:

SELECT 
    CodeSetId = xc.value('@id', 'int'), 
    Description = xc.value('(entry/@description)[1]', 'varchar(50)') 
FROM 
    dbo.YourTableNameHere 
CROSS APPLY 
    YourXmlColumn.nodes('/code_set/code') AS XT(XC) 

これは基本的に、それぞれがそのXMLフラグメントを含む、ビルトインのXQuery単一の列(XC)で「インメモリ」テーブル(XT)を取得するために使用しています<code_set>ルートノード内にそれぞれ<code>ノードを表します。

これらのXMLフラグメントのそれぞれを取得したら、.value() XQuery演算子を使用して、「到達」し、そこからいくつかの情報を取得できます。 @id(属性はidの属性)、または含まれている<entry>サブエレメントの@description属性です。

関連する問題