Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-从XML文件查询数据_Sql_Sql Server_Xml - Fatal编程技术网

SQL Server-从XML文件查询数据

SQL Server-从XML文件查询数据,sql,sql-server,xml,Sql,Sql Server,Xml,我不熟悉XML。我已经了解了如何从XML文件中查询和返回值(下面的示例)。但是,我遇到了一个问题,即它只捕获“SerialNo”标记的第一个节点,因为该标记具有相同的节点名“SerialNo”。在XML文件中,它有4个SKU的序列号#TT234343,但它只给出了第一个序列号11111。我完全被卡住了,不知道如何列出所有这些连载 我想要SKU#TT234343的查询结果,如果可能,列出所有4个序列号 请帮忙。谢谢 XML文件如下所示: <?xml version="1.0" encodin

我不熟悉XML。我已经了解了如何从XML文件中查询和返回值(下面的示例)。但是,我遇到了一个问题,即它只捕获“SerialNo”标记的第一个节点,因为该标记具有相同的节点名“SerialNo”。在XML文件中,它有4个SKU的序列号#TT234343,但它只给出了第一个序列号11111。我完全被卡住了,不知道如何列出所有这些连载

我想要SKU#TT234343的查询结果,如果可能,列出所有4个序列号

请帮忙。谢谢

XML文件如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<ROOT>
  <ShipNotice version="1" >
    <InvoiceDate>01/01/2015</InvoiceDate>
    <InvoiceNumber>6868686</InvoiceNumber>
    <ShipDate>02/02/2015</ShipDate>
    <ShipTime>2306</ShipTime>
    <PONumber>P444444</PONumber>
    <PODate>03/03/2015</PODate>
    <ShipCode>XXX</ShipCode>
    <ShipDescription>FedEx Economy</ShipDescription>
    <ShipTo>
      <AddressName>ShipABC</AddressName>
      <AddressContact>Name1</AddressContact>
      <AddressLine1>2222 Street Name</AddressLine1>
      <AddressLine2> </AddressLine2>
      <City>AUSTIN</City>
      <State>TX</State>
      <ZipCode>78111</ZipCode>
    </ShipTo>
    <BillTo>
      <AddressName>BillABC</AddressName>
      <AddressContact>Name1</AddressContact>
      <AddressLine1>1234 Street Name</AddressLine1>
      <AddressLine2>-SUITE 111</AddressLine2>
      <City>Los Angeles</City>
      <State>CA</State>
      <ZipCode>95136</ZipCode>
    </BillTo>
    <TotalWeight>324</TotalWeight>
    <EmptyCartonWGT>0</EmptyCartonWGT>
    <NumberOfCarton>1</NumberOfCarton>
    <DirectShipFlag>D</DirectShipFlag>
    <ShipFromWarehouse>88</ShipFromWarehouse>
    <ShipFromZip>94538</ShipFromZip>
    <ShipTrackNo>33333333</ShipTrackNo>
    <EndUserPONumber>55555555</EndUserPONumber>
    <CustomerSONumber/>
    <Package sequence="1" >
      <TrackNumber>666666666</TrackNumber>
      <PackageWeight>324</PackageWeight>
      <Item sequence="1" >
        <SOLineNo>1</SOLineNo>
        <MfgPN>XYZ1111111</MfgPN>
        <SKU>TT234343</SKU>
        <ShipQuantity>4</ShipQuantity>
        <CustPOLineNo>1</CustPOLineNo>
        <CustSOLineNo/>
        <Description>Server1234</Description>
        <CustPN/>
        <UPC/>
        <UnitPrice>1000</UnitPrice>
        <EndUserPOLineNo>0</EndUserPOLineNo>
        <SerialNo>Serial11111</SerialNo>
        <SerialNo>Serial22222</SerialNo>
        <SerialNo>Serial33333</SerialNo>
        <SerialNo>Serial44444</SerialNo>
      </Item>
      <Item sequence="2" >
        <SOLineNo>2</SOLineNo>
        <MfgPN>XYZ222222</MfgPN>
        <SKU>TT8848788</SKU>
        <ShipQuantity>4</ShipQuantity>
        <CustPOLineNo>2</CustPOLineNo>
        <CustSOLineNo/>
        <Description>GGG localization</Description>
        <CustPN/>
        <UPC/>
        <UnitPrice>0.00</UnitPrice>
        <EndUserPOLineNo>0</EndUserPOLineNo>
        <SerialNo/>
      </Item>
    </Package>
  </ShipNotice>
</ROOT>

您可以尝试使用较新的XQuery技术,而不是
OPENXML()
。使用XQuery,您可以使用方法分解与输出中的行相对应的元素上的XML,并使用提取元素值:

SELECT
    shipnotice.value('InvoiceNumber[1]','varchar(20)') InvoiceNumber
    , shipnotice.value('PONumber[1]','varchar(20)') PONumber
    , shipnotice.value('PODate[1]','varchar(20)') PODate
    , shipnotice.value('(ShipTo/AddressName)[1]','varchar(100)') AddressName
    , item.value('MfgPN[1]','varchar(100)') MfgPN
    , serialno.value('.','varchar(100)') SerialNo
FROM @XML.nodes('/ROOT/ShipNotice') as t(shipnotice)
    OUTER APPLY shipnotice.nodes('Package/Item') as t2(item)
    OUTER APPLY item.nodes('SerialNo') as t3(serialno)

输出:

| InvoiceNumber | PONumber |     PODate | AddressName |      MfgPN |    SerialNo |
|---------------|----------|------------|-------------|------------|-------------|
|       6868686 |  P444444 | 03/03/2015 |     ShipABC | XYZ1111111 | Serial11111 |
|       6868686 |  P444444 | 03/03/2015 |     ShipABC | XYZ1111111 | Serial22222 |
|       6868686 |  P444444 | 03/03/2015 |     ShipABC | XYZ1111111 | Serial33333 |
|       6868686 |  P444444 | 03/03/2015 |     ShipABC | XYZ1111111 | Serial44444 |
|       6868686 |  P444444 | 03/03/2015 |     ShipABC |  XYZ222222 |             |

谁是XML方面的专家?有没有相同结果的不同方法?谢谢
| InvoiceNumber | PONumber |     PODate | AddressName |      MfgPN |    SerialNo |
|---------------|----------|------------|-------------|------------|-------------|
|       6868686 |  P444444 | 03/03/2015 |     ShipABC | XYZ1111111 | Serial11111 |
|       6868686 |  P444444 | 03/03/2015 |     ShipABC | XYZ1111111 | Serial22222 |
|       6868686 |  P444444 | 03/03/2015 |     ShipABC | XYZ1111111 | Serial33333 |
|       6868686 |  P444444 | 03/03/2015 |     ShipABC | XYZ1111111 | Serial44444 |
|       6868686 |  P444444 | 03/03/2015 |     ShipABC |  XYZ222222 |             |