2017-01-13 5 views
0

から値を抽出するためにどのように私は、XMLでこのような何かをフィールドを持っている:XMLフィールド

<ApplicationProductFields> 
    <string> 
    <field name="Tech_LoginUzytkownika">lechowski</field> 
    </string> 
    <int /> 
    <decimal /> 
    <bool /> 
    <datetime /> 
    <appendix /> 
    <enum /> 
    <complex> 
    <field name="danePrzesylki"> 
     <fv> 
     <rodzajPrzesylki>sPP</rodzajPrzesylki> 
     <dataWplywu>d08/24/2016 00:00:00</dataWplywu> 
     <nadawcaNazwisko>sKowalski</nadawcaNazwisko> 
     <dokumenty> 
      <tytulDokumentu>sDokument testowy 45</tytulDokumentu> 
      <dataUtworzenia>d2016-06-13 00:00:00</dataUtworzenia> 

私は、別のテーブルのフィールドに元のすべての値を挿入する必要があります。

|rodzajPrzesylki|  dataWplywu  |nadawcaNazwisko| tytulDokumentu |... 
|  sPP  |d08/24/2016 00:00:00| sKowalski |sDokument testowy |... 

私は、このSQLクエリのSQLクエリを見つけました:

SELECT 
col.value('(/ArrayOfEntityPropertyOfString/EntityPropertyOfString[Name="Profit Center"]/Value)[1]', 'int') 
FROM tbl 

しかし、私は私のxmlの建設とそれを使用する方法がわかりません。

誰でも手伝ってください。

答えて

0

このXMLとその世代があなたのコントロール下にある場合、あなたはそれについて考える必要があります。

  1. XMLが正しく生成されませんでした。 XML内の日付/時刻値はISO8601に従う必要があります...手動で変換する必要があります。

  2. 私は、最初の文字( "sPP"または "d08/24 ...")は非常に専門家ではないデータ型マーク(文字列と日付)のようなものだと思います。これをマークするために、より良い使用タイプの属性またはスキーマ...

あなたが提供するXMLは、(私はいくつかのタグを使用してXMLを閉じなければならなかった)完全ではありません、どちらもあなたは、ターゲットテーブルの構造を示しました。 とにかくまずXMLをシュレッドすることです。これにより、派生テーブルが作成されます。私の例ではCTEを使用してSELECTステートメントにこのテーブルを提供します。最後にSELECT * FROM CTE;と表示されます。

DECLARE @xml XML= 
N'<ApplicationProductFields> 
    <string> 
    <field name="Tech_LoginUzytkownika">lechowski</field> 
    </string> 
    <int /> 
    <decimal /> 
    <bool /> 
    <datetime /> 
    <appendix /> 
    <enum /> 
    <complex> 
    <field name="danePrzesylki"> 
     <fv> 
     <rodzajPrzesylki>sPP</rodzajPrzesylki> 
     <dataWplywu>d08/24/2016 00:00:00</dataWplywu> 
     <nadawcaNazwisko>sKowalski</nadawcaNazwisko> 
     <dokumenty> 
      <tytulDokumentu>sDokument testowy 45</tytulDokumentu> 
      <dataUtworzenia>d2016-06-13 00:00:00</dataUtworzenia> 
     </dokumenty> 
     </fv> 
    </field> 
    </complex> 
</ApplicationProductFields>'; 

--Theクエリ

WITH CTE AS 
(
    SELECT fld.value(N'@name','nvarchar(max)') AS FieldName 
      ,fld.value(N'(fv/rodzajPrzesylki)[1]','nvarchar(max)') AS rodzajPrzesylki 
      ,fld.value(N'(fv/dataWplywu)[1]','nvarchar(max)') AS dataWplywu 
      ,fld.value(N'(fv/nadawcaNazwisko)[1]','nvarchar(max)') AS nadawcaNazwisko 
      ,fld.value(N'(fv/dokumenty/tytulDokumentu)[1]','nvarchar(max)') AS tytulDokumentu 
      ,fld.value(N'(fv/dokumenty/dataUtworzenia)[1]','nvarchar(max)') AS dataUtworzenia 
    FROM @xml.nodes(N'/ApplicationProductFields/complex/field') AS A(fld) 
) 
SELECT * FROM CTE; 

ちょうど

INSERT INTO MyTargetTable(FieldName, rodarodzajPrzesylki, ...) 
SELECT FieldName,rodzajPrzesylki,... 
FROM CTE 
のようにそこに何かを置く:それは普通のテーブルから取られるかのようにこれは、結果セットを提供します
0

見つけたものはXPathです。 XMLで動作するこのクエリ言語は、XMLドキュメントからノードにアクセスするために必要なパスを記述する、非常に単純な構文を持っています。それはdefined by the w3cであり、MDNはよりアクセスしやすい方法でそれを文書化するかなり良い仕事をします。

私はあなたがドキュメントをチェックし、あなたのrodzajPrzesylkiフィールドのためのあなたのXPathの例をあげてみましょうよ:

/ApplicationProductFields/complex/field[name="danePrzesylki"]/fv/rodzajPrzesylki 
関連する問題