2017-06-12 7 views
0

列の1つがXML形式のデータをテーブルから取得しています。列の名前は「更新済み」、表は「監査」です。フィールドは次のようになります。SQL ServerからXMLフィールドを取得しようとしています

<Fields><Field Name="DateFrom"/><Field Name = "Type 1"/><Field Name = "Type 2/></Fields> 

    <Fields><Field Name = "DateFrom"/></Fields> 

    <Fields><Field Name="DateFrom"/><Field Name = "Note"/><Field Name = "Type 1"/></Fields> 

XMLフィールドは、大きなクエリの一部です:

Select id, Updated 
    from Audit 

最後はIDが非XML列であることを、次のようになります。

ID  Updated 

123 DateFrom, Type1, Type2 
323 DateFrom 
455 DateFrom, Note, Type1 

私はオンラインで見つけたいくつかのことを試しましたが、これを正しく実行していません。私が試した1つの方法は次のとおりでした:

Select Updated.value('/Fields/Field Name)[1]', 'nvarchar(max)') as NewUpdated from Audit. 

アイデアはありますか?

+0

を。最初のものだけが必要な場合は、現在のクエリを '(Fields/Field/@ Name)[1]'として調整することができます。 'SELECT NewUpdated = ABvalue( '@ Name'、 'nvarchar(max)')FROM Audit CROSS APPLY Audit.Updated.nodes( 'Fields/Field')AS A(B);' – ZLK

+0

私はすべてのフィールドを取得する必要があります。私はクロスを適用しようとしているが、私はエラーが発生している: "Audit.updated.nodes 'は認識された関数名ではない:私はこれをしようとしている:select newupdated = ABvalue(' @ name '、' nvarchar(max ) '' Audit CrossからAudit.updated.nodes( 'Fields/Field')をA(B)として適用; – jackstraw22

+0

Uh、どのバージョンのSQL Serverを使用していますか? '.value(...)')、SQL Server 2005などを使用していない限り、なぜうまくいかないのか考える理由はありません。 – ZLK

答えて

1

あなたはvaluenodes、このようなstuff

DECLARE @Audit AS TABLE 
(
    Id int, 
    Updated xml 
) 

INSERT INTO @Audit 
(
    Id, 
    Updated 
) 
VALUES 
(1,N'<Fields><Field Name="DateFrom"/><Field Name = "Type 1"/><Field Name = "Type 2" /></Fields>'), 
(2,N'<Fields><Field Name = "DateFrom"/></Fields>'), 
(3, N'<Fields><Field Name="DateFrom"/><Field Name = "Note"/><Field Name = "Type 1"/></Fields>')  

    SELECT a.Id, ca.NewUpdated 
FROM @Audit a 
    CROSS APPLY 
    (
    SELECT STUFF(
        (SELECT ', ' + x.n.value('(./@Name)[1]', 'varchar(20)') 
        FROM a.Updated.nodes('/Fields/Field') x(n) 
        FOR XML PATH('') 
       ),1,2,'') AS NewUpdated 
    ) ca 

デモリンク使用することができますあなたが_each_フィールドを取得する必要がある場合は、XMLノードと適用クロスを使用する必要がありますhttp://rextester.com/NNF94534

+0

これは面白そうです。フィールド名の数がレコードごとに異なる場合、これは機能しますか?一部のレコードには、 "DateFrom"と "Type1"と "Notes"があります。他の人は、 "DateFrom"などしか持たないかもしれません。あなたが値をハードコーディングしているかのように見えます。値には行の値を動的に取り込む必要があります。 1行に表示されるすべての値も、コード内の1行に表示する必要があります。DateFrom、Type1、Type2は、特定のレコードのフィールドの場合は1行に表示する必要があります。 – jackstraw22

+0

私は何かをharcodeしなかった。 'Field'要素に 'Name'属性がある場合、それは機能します。質問を編集して、期待した結果を提供できますか? – TriV

+0

私は質問をより具体的に更新しました。私はあなたが手作業で値をVALUES部分に入力したと思っていました。問題のXMLは正確です。 を使用します... – jackstraw22

関連する問題