0

txt ファイルから xml を取得しましたが、奇妙なエラーが発生しました (私にとって) txt ファイルには 2 つの顧客と 6 つの製品があります

そのまま

結果セットは

CUSTID  ORDER ID               
98295   29199752211 0   1   2321
98295   29199752211 0   1   76
98295   29199752211 0   2   179
98295   29199752211 0   3   180
98295   29199752211 0   4   320
98295   29199752211 0   5   NULL

なぜ顧客 ID が同じなのですか? テキストファイルには2があります。少しでもお役に立てれば幸いです。

        SELECT
            (SELECT LNGNO FROM ARTUT13.DBO.TBLFATURA WHERE TXTOZELKOD=(c6.value('(//FISLER/FIS/FISID)[1]','VARCHAR(100)'))),--[LNGNO] 
            0,--[BYTTUR] 
            c6.value('(KALEMNO)[1]','VARCHAR(100)'),--[LNGKALEMSIRA]
            (SELECT LNGKOD FROM ARTUT13.DBO.TBLURUN WHERE TXTKOD=(c6.value('(URUNKODU)[1]','VARCHAR(100)'))),
            c6.value('(MIKTAR)[1]','VARCHAR(100)'),--[DBLMIKTAR]
            1,--[BYTBIRIMSIRA]
            1,--[DBLCEVRIM]
            c6.value('(BIRIMFIYAT)[1]','VARCHAR(100)'),--[DBLBIRIMFIYAT]
            0,--[BYTKAYITTIP] 
            0,--[BYTDETAYMAL] 
            c6.value('(KDV)[1]','VARCHAR(100)'),--[DBLKDVORANI]
            c6.value('(FIYAT)[1]','VARCHAR(100)'),--[DBLNETFIYAT]
            '',--[TXTOZELKOD]
            0,--[LNGVADEGUNU]
            GETDATE(),--[TRHSONISLEMTARIHI] 
            'MUHASEBE2',--[TXTSONISLEMHOST]
            '',--[DBLOTV] 
            c6.value('(//FISLER/FIS/FISID)[1]','VARCHAR(100)'),--[TXTOZELKOD1] 
            ''--[TXTOZELKOD2]
        from
        (select cast(c1 as xml) from OPENROWSET (BULK 'C:\AKTAR\FATURA.txt',SINGLE_BLOB
        ) as T1(c1) )as  T2(c2)
        outer apply c2.nodes('FISLER/FIS/KALEMLER/KALEM')  T6(c6)

テキストファイルに含まれるもの

    <FISLER>
       <FIS>
          <FISTIPI>SATIS</FISTIPI>
          <FISID>29199752211</FISID>
          <FISNO>a67502</FISNO>
          <IPTAL>0</IPTAL>
          <TARIH>13.02.2013</TARIH>
          <MUSKODU>35170339P</MUSKODU>
          <MUSADI>MEHMET PEHLIVAN - MORTAN GIDA MEHMET PEHLIVAN</MUSADI>
          <VERGIDAIRESI>KARABURUN MAL MD</VERGIDAIRESI>
          <VERGINO>47035582576</VERGINO>
          <DEPOKODU>01</DEPOKODU>
          <ODEMETIPI>6</ODEMETIPI>
          <TOPLAMBRUT>1200.24</TOPLAMBRUT>
          <TOPLAMISKONTO>60.01</TOPLAMISKONTO>
          <TOPLAMKDV>205.24</TOPLAMKDV>
          <TOPLAMNET>1345.47</TOPLAMNET>
          <SATISTEMSILCISIKODU>001</SATISTEMSILCISIKODU>
          <DAGITICIKODU></DAGITICIKODU>
          <ARACKODU></ARACKODU>
          <ARACPLAKA></ARACPLAKA>
          <SEVKNO></SEVKNO>
          <VADETARIHI>06.03.2013</VADETARIHI>
          <KALEMLER>
             <KALEM>
                <KALEMNO>1</KALEMNO>
                <URUNKODU>4009011024</URUNKODU>
                <URUNADI>EFE KLASİK RAKI45º-100clx12AD TAVA( 63,50 FİYATLI)</URUNADI>
                <MIKTAR>24</MIKTAR>
                <BIRIMFIYAT>50.01</BIRIMFIYAT>
                <FIYAT>1200.24</FIYAT>
                <BIRIM></BIRIM>
                <KDV>18</KDV>
                <ISKONTOLAR>
                   <ISKONTO>
                      <price>1200.24</price>
                      <KODU></KODU>
                      <ADI>Ürün İsk.1</ADI>
                      <TIPI></TIPI>
                      <ORAN>5</ORAN>
                      <TUTAR>60.012</TUTAR>
                   </ISKONTO>
                </ISKONTOLAR>
             </KALEM>
          </KALEMLER>
       </FIS>
       <FIS>
          <FISTIPI>SATIS</FISTIPI>
          <FISID>29199773107</FISID>
          <FISNO>a67511</FISNO>
          <IPTAL>0</IPTAL>
          <TARIH>13.02.2013</TARIH>
          <MUSKODU>100242</MUSKODU>
          <MUSADI>NUMBER ONE APART OTEL RESTAURANT</MUSADI>
          <VERGIDAIRESI>KARABURUN</VERGIDAIRESI>
          <VERGINO>50545253560</VERGINO>
          <DEPOKODU>01</DEPOKODU>
          <ODEMETIPI>6</ODEMETIPI>
          <TOPLAMBRUT>2634.24</TOPLAMBRUT>
          <TOPLAMISKONTO>195.21</TOPLAMISKONTO>
          <TOPLAMKDV>439.03</TOPLAMKDV>
          <TOPLAMNET>2878.06</TOPLAMNET>
          <SATISTEMSILCISIKODU>001</SATISTEMSILCISIKODU>
          <DAGITICIKODU></DAGITICIKODU>
          <ARACKODU></ARACKODU>
          <ARACPLAKA></ARACPLAKA>
          <SEVKNO></SEVKNO>
          <VADETARIHI>06.03.2013</VADETARIHI>
          <KALEMLER>
             <KALEM>
                <KALEMNO>1</KALEMNO>
                <URUNKODU>4001017212</URUNKODU>
                <URUNADI>EFE YAŞ ÜZÜM RAKISI (45º) - 70 cl 12LI KOLİ</URUNADI>
                <MIKTAR>12</MIKTAR>
                <BIRIMFIYAT>47.03</BIRIMFIYAT>
                <FIYAT>564.36</FIYAT>
                <BIRIM></BIRIM>
                <KDV>18</KDV>
                <ISKONTOLAR>
                   <ISKONTO>
                      <price>564.36</price>
                      <KODU></KODU>
                      <ADI>Ürün İsk.1</ADI>
                      <TIPI></TIPI>
                      <ORAN>10</ORAN>
                      <TUTAR>56.436</TUTAR>
                   </ISKONTO>
                </ISKONTOLAR>
             </KALEM>
             <KALEM>
                <KALEMNO>2</KALEMNO>
                <URUNKODU>4001012324</URUNKODU>
                <URUNADI>EFE YAŞ ÜZÜM RAKISI (45º) - 20 cl 24 LU KOLİ</URUNADI>
                <MIKTAR>24</MIKTAR>
                <BIRIMFIYAT>16.07</BIRIMFIYAT>
                <FIYAT>385.68</FIYAT>
                <BIRIM></BIRIM>
                <KDV>18</KDV>
                <ISKONTOLAR>
                   <ISKONTO>
                      <price>385.68</price>
                      <KODU></KODU>
                      <ADI>Ürün İsk.1</ADI>
                      <TIPI></TIPI>
                      <ORAN>10</ORAN>
                      <TUTAR>38.568</TUTAR>
                   </ISKONTO>
                </ISKONTOLAR>
             </KALEM>
             <KALEM>
                <KALEMNO>3</KALEMNO>
                <URUNKODU>4001013724</URUNKODU>
                <URUNADI>EFE YAŞ ÜZÜM RAKISI (45º) - 35 cl 24 LU KOLİ</URUNADI>
                <MIKTAR>24</MIKTAR>
                <BIRIMFIYAT>26.66</BIRIMFIYAT>
                <FIYAT>639.84</FIYAT>
                <BIRIM></BIRIM>
                <KDV>18</KDV>
                <ISKONTOLAR>
                   <ISKONTO>
                      <price>639.84</price>
                      <KODU></KODU>
                      <ADI>Ürün İsk.1</ADI>
                      <TIPI></TIPI>
                      <ORAN>10</ORAN>
                      <TUTAR>63.984</TUTAR>
                   </ISKONTO>
                </ISKONTOLAR>
             </KALEM>
             <KALEM>
                <KALEMNO>4</KALEMNO>
                <URUNKODU>4001011013</URUNKODU>
                <URUNADI>EFE YAŞ ÜZÜM RAKISI (45º) - 100 cl 12LI TAVA</URUNADI>
                <MIKTAR>6</MIKTAR>
                <BIRIMFIYAT>60.37</BIRIMFIYAT>
                <FIYAT>362.22</FIYAT>
                <BIRIM></BIRIM>
                <KDV>18</KDV>
                <ISKONTOLAR>
                   <ISKONTO>
                      <price>362.22</price>
                      <KODU></KODU>
                      <ADI>Ürün İsk.1</ADI>
                      <TIPI></TIPI>
                      <ORAN>10</ORAN>
                      <TUTAR>36.222</TUTAR>
                   </ISKONTO>
                </ISKONTOLAR>
             </KALEM>
             <KALEM>
                <KALEMNO>5</KALEMNO>
                <URUNKODU>4010017001</URUNKODU>
                <URUNADI>EFE 5 YILLIK RAKI45º-70clx3AD KOLİ</URUNADI>
                <MIKTAR>6</MIKTAR>
                <BIRIMFIYAT>113.69</BIRIMFIYAT>
                <FIYAT>682.14</FIYAT>
                <BIRIM></BIRIM>
                <KDV>18</KDV>
             </KALEM>
          </KALEMLER>
       </FIS>
    </FISLER>
4

1 に答える 1

0

1) Your question is not clear: how can be extracted CUSTID from that XML ? There is not CUSTID element in that XML.

2) Very likely, the cause is (if I look at your source code) the usage of absolute references (.value('(//element...)[1]',...)) instead of relative references (.value('(element...)[1]',...)).

Sample:

DECLARE @x XML;
SET @x = N'<...>';
SELECT  c6.value('(//FISLER/FIS/FISID)[1]','VARCHAR(100)') AS AbsoluteRef_FISID
FROM    @x.nodes('FISLER/FIS/KALEMLER/KALEM')  T6(c6)

SELECT  c6.value('(FISID)[1]','VARCHAR(100)') AS RelativeRef_FISID
FROM    @x.nodes('FISLER/FIS')  T6(c6)

Results:

AbsoluteRef_FISID
-------------------
29199752211
29199752211
29199752211
29199752211
29199752211
29199752211

RelativeRef_FISID
-------------------
29199752211
29199773107

// means absolute references and c6.value('(//FISLER/FIS/FISID)[1]','VARCHAR(100)') will extract only the first ([1]) FISID value from that XML.

.value('(FISID)[1]',...) uses a relative reference (relative to nodes('FISLER/FIS') T6(c6)) and the result will contains all FISID values. If your run this query

SELECT  c6.query('.') AS XmlNode
FROM    @x.nodes('FISLER/FIS')  T6(c6);

you will get two rows meaning that .nodes('FISLER/FIS') will extract two rows

XmlNode
----------------------------------------------------------------------------
<FIS><FISTIPI>SATIS</FISTIPI><FISID>29199752211</FISID><FISNO>a67502</FISNO>
<FIS><FISTIPI>SATIS</FISTIPI><FISID>29199773107</FISID><FISNO>a67511</FISNO>

from @x XML variable. Starting from this point (two rows), the value method .value('(FISID)[1]',...) will extract the first FISID ((FISID)[1]) for every row. Thus, you will get two FISID values.

SQLFiddle demo

于 2013-02-16T10:36:25.013 に答える