需要从文本帮助XML

时间:2013-02-16 09:18:34

标签: sql-server xml tsql

我有来自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

为什么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>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>

1 个答案:

答案 0 :(得分: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')将提取两行

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

来自@x XML变量。从这一点开始(两行),值方法.value('(FISID)[1]',...)将为每一行提取第一个FISID(FISID)[1])。因此,您将获得两个FISID值。

SQLFiddle demo