2

以下のSQLを使用してxmlからデータを抽出できることがわかりました

--XML DATA SAMPLE        
DECLARE @xmlvar xml      
SET @xmlvar='      
<NewDataSet>      
  <param>      
    <SearchField>JID</SearchField>      
    <FilterCondition>%</FilterCondition>      
    <ConditionData>4000</ConditionData>      
    <MatchCase>0</MatchCase>      
    <Table>MyTableName</Table>      
  </param>      
  <param>      
    <SearchField>Specialist</SearchField>      
    <FilterCondition>=</FilterCondition>      
    <ConditionData>Nigel Graham</ConditionData>      
    <MatchCase>0</MatchCase>      
    <Table>MyTableName</Table>      
  </param>      
</NewDataSet>'  

SELECT  A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField,
A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator,
A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
A.B.value('(MatchCase)[1]', 'BIT' ) MatchCase,
A.B.value('(Table)[1]', 'VARCHAR(MAX)' ) TableName
FROM    @WhereClause_XML.nodes('/NewDataSet/param') A(B)

上記のxmlは機能していますが、上記のタイプのSQLに精通していません。では、(FilterCondition)[1]または(ConditionData)[1]の意味を教えてください。なぜ括弧[1]を括弧[0]または[2]にしないのですか。

上記のxmlがどのように機能するか説明してください。ありがとう

4

2 に答える 2

1

基本的に、FROMここでの条項:

FROM @WhereClause_XML.nodes('/NewDataSet/param') A(B)

XMLフラグメントの「疑似テーブル」を作成します-すべてのXMLノードを列挙し、タイプが疑似列を持つ<NewDataSet>/<param>その疑似テーブル(と呼ばれる)を作成します。ABXML

これらの列には<param>-の値が含まれ、SELECTはこれらのXMLノードに到達しています

SELECT A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField

ここでは、<param>ノードから最初の<SearchField>XML要素値が取得されSearchField、タイプが呼び出される列として返されますVARCHAR(255)

コードの外観から、各<param>ノードはおそらく次のようになります。

<param>
    <SearchField>......</SearchField>
    <FilterCondition>....</FilterCondition>
    <ConditionData>....</ConditionData>
    <MatchCase>....</MatchCase>
    <Table>....</Table>
</param>

これらの値はすべて、SELECTステートメントの列に抽出されます。

于 2012-01-04T18:05:40.527 に答える
1

value()関数はXMLから1つの値を返すため、使用されるXPathは1つの特定のノードを指している必要があります。[1]inは、XMLで(SearchField)[1]最初に出現する値からの値が必要であることを意味します。もちろん、2回目の発生になります。あなたなしでのすべての出現を求めています。SearchField[2][1]SearchField

更新:サンプルコード:

declare @x xml = 
'<root>
  <item>1</item>
  <item>2</item>
</root>'

select @x.value('(root/item)[1]', 'int') as One,
       @x.value('(root/item)[2]', 'int') as Two

結果:

One         Two
----------- -----------
1           2
于 2012-01-04T18:14:42.560 に答える