2013-02-16 56 views
0

幫助XML我從txt文件的XML我得到奇怪的錯誤(對我來說) 有2個客戶和6種產品的txt文件需要從文本

結果集是

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 

爲什麼cust-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>4001</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> 
+0

看起來不像設定的結果,你必須在相關的XML或查詢任何方式。 XML中沒有值「98295」,並且查詢輸出中沒有「custid」列。 – 2013-02-16 10:17:11

+0

是的,它只是在txt文件中複製了Custid,即。 98295來自另一個表格(SELECT LNGNO FROM ARTUT13.DBO.TBLFATURA WHERE TXTOZELKOD =(c6.value('(// FISLER/FIS/FISID)[1]','VARCHAR(100)'))),thnx – user2078011 2013-02-16 10:22:13

+0

我猜這將是你的問題是無論你使用'c6.value('(// FISLER/FIS/FISID)[1]','VARCHAR(100)')',因爲它總是會找到第一個'FISID '在XML中。試試這個。 'c6.value( '(../../ FISID)[1]', 'VARCHAR(100)')'。 – 2013-02-16 10:22:53

回答

0

1)你的問題不明確:如何可以提取從XML CUSTID該XML中沒有CUSTID元素。

2)很有可能,原因是(如果我看你的源代碼)使用絕對引用(.value('(//element...)[1]',...))而不是相對引用(.value('(element...)[1]',...))。

樣品:

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) 

結果:

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

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

//意味着絕對引用和c6.value('(//FISLER/FIS/FISID)[1]','VARCHAR(100)')將提取從XML僅第一([1]FISID值。

.value('(FISID)[1]',...)使用相對參考(相對於nodes('FISLER/FIS') T6(c6))和結果將含有所有FISID值。 如果您運行此查詢

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

你會得到兩行意味着.nodes('FISLER/FIS')將提取@x XML可變兩行

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

。從這一點開始(兩行),值方法.value('(FISID)[1]',...)將爲每一行提取第一個FISID(FISID)[1])。因此,您將獲得兩個FISID值。

SQLFiddle demo

+0

注意:你可以使用相對的參考。因此:'SELECT c6.value('(../../ FISID)[1]','VARCHAR(100)')AS RelativeRef_FISID FROM @ x.nodes('FISLER/FIS/KALEMLER/KALEM')T6 C6);' – 2013-02-16 10:40:22