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)您的问题不清楚:如何CUSTID从该 XML 中提取?该 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 方法将为每一行.value('(FISID)[1]',...)提取第一个FISID( )。(FISID)[1]因此,您将获得两个FISID值。

SQLFiddle 演示

于 2013-02-16T10:36:25.013 回答