0

別のXMLクエリについてもう少し助けが必要です。以下は、私のXML列のレコードの例です。

<Fields>
  <MappedFields>
    <Field name="FormNumber" value="21" />
    <Field name="ProcedureCode" value="T2023" />
    <Field name="CurrentDate" value="4/23/2012" />
  </MappedFields>
</Fields>

フィールド要素は任意の順序で表示される可能性があるため、次のように表示することもできます。

<Fields>
  <MappedFields>
    <Field name="ProcedureCode" value="G5532" />
    <Field name="FormNumber" value="12" />
    <Field name="CurrentDate" value="3/29/2011" />
  </MappedFields>
</Fields>

私が探しているのは、テーブル内のすべてのレコードの「FormNumber」という名前のフィールドの値を取得するクエリです。以下のクエリは、「FormNumber」という名前のフィールドがXMLの最初のフィールド要素である場合に機能します。必要なのは、最初の要素でなくてもField要素を見つけるクエリです。誰かがこれを手伝ってくれますか?

SELECT
     X.Node.value(N'(Field/@value)[1]', 'nvarchar(max)') AS FormNumber
FROM 
    dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'/Fields/MappedFields') AS X(Node)
WHERE
    X.Node.value(N'(Field/@name)[1]', 'nvarchar(max)') = 'FormNumber'
4

1 に答える 1

2

のような xml パスでテストを行うことができます[@name="FormNumber"]

SELECT
     X.Node.value(N'(Field[@name="FormNumber"]/@value)[1]', 'nvarchar(max)') AS FormNumber
FROM 
    dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'//Fields/MappedFields') AS X(Node)

は今は必要ないことに注意してくださいWHERE

テストを次の場所に移動する方が理にかなっている場合がありCROSS APPLYます。

SELECT
     X.Node.value(N'(./@value)[1]', 'nvarchar(max)') AS FormNumber
FROM 
    dbo.MHTCM_LetterSent A
CROSS APPLY A.LetterXML.nodes(N'//Fields/MappedFields/Field[@name="FormNumber"]') AS X(Node)

編集-パスを絶対 (//) にしましたが、両方の例が機能しています。

于 2012-04-30T18:54:23.187 に答える