【问题标题】:Load XML file into MS SQL Server table将 XML 文件加载到 MS SQL Server 表中
【发布时间】:2020-05-06 14:41:04
【问题描述】:

我在大约 6 周前问过这个问题,但我并不清楚我发布了什么、我期望什么以及如何实现它。尽管一些用户有耐心,但我无法解决我的问题。我已经回去尝试了解更多信息,希望我现在可以发布一些更有意义的内容。

客户以 XML 文件的格式发送他的交货计划。这不是最有说服力的文件,但我想我已经理解了。我需要从中得到一张这样的表格,它告诉我客户在任何给定的一周内想要多少给定的零件。有 50 多个零件和 12 周,但我已将其减少到 5 个,希望可以在这里发布。

Schedule Date    PartNumber   Week Number   Quantity
20/02/2020       Part0        0             0
20/02/2020       Part0        1             50
20/02/2020       Part0        2             0
20/02/2020       Part0        3             0
20/02/2020       Part0        4             50
20/02/2020       Part0        5             0
20/02/2020       Part1        0             0
20/02/2020       Part1        1             40

我要做的是每周将此信息附加到一个表格中,而日程安排日期就是日程安排的日期。该日期取自这一行(第 11 行):

<Field Name="DataDate2" FieldName="DataDate"><FormattedValue>10/02/2020</FormattedValue><Value>2020-02-10</Value></Field>

零件编号、周数和数量稍微复杂一些。零件编号来自编号列表

<RowGroups>
<RowGroup>
<RowGroup>
<RowTotal RowNumber="0">PART0</RowTotal>
<RowTotal RowNumber="1">PART1</RowTotal>
<RowTotal RowNumber="2">PART2</RowTotal>
<RowTotal RowNumber="3">PART3</RowTotal>
<RowTotal RowNumber="4">PART4</RowTotal>
<RowTotal RowNumber="5">PART5</RowTotal>
</RowGroup>
</RowGroup>
</RowGroups>

以及本节中的周数和数量;

<Cells>
<Cell RowNumber="0" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="1">
<CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
</Cell>

其中行号是部件号参考,列号是星期。该值是值(和格式化的值)。

我的想法是创建两个表,一个包含所有部件号和行号的参考表,另一个包含行号、周数和数量的表,然后在行字段中将它们连接在一起。任何一个表都可以保存计划日期。

谁能给我一些代码来帮助我实现这一目标。

我已经尝试以此为起点来创建第一个零件编号表,但这只会返回 0 条记录:


DECLARE @xml XML
SELECT @xml =
CONVERT(XML,bulkcolumn,2) FROM OPENROWSET(BULK 'theFile.xml',SINGLE_BLOB) AS X

DECLARE @tempTable TABLE (
partnumber NVARCHAR(50),
rownumber int
)

INSERT INTO @tempTable
SELECT  Tbl.Col.value('@RowNumber', 'INT'),
        Tbl.Col.value('@RowTotal','NVARCHAR(50)')
FROM   @xml.nodes('//RowGroup') Tbl(Col)

SELECT * FROM @tempTable

这是 XML:

<?xml version="1.0" encoding="UTF-8" ?>
<CrystalReport xmlns="urn:crystal-reports:schemas:report-detail"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:crystal-reports:schemas:report-detail http://www.businessobjects.com/products/xml/CR2008Schema.xsd">
<ReportHeader>
</ReportHeader>
<Group Level="1">
<GroupHeader>
<Section SectionNumber="0">
<Text Name="Text4"><TextValue>DELIVERY SCHEDULE</TextValue>
</Text>
<Field Name="DataTime2" FieldName="DataTime"><FormattedValue>09:00:04</FormattedValue><Value>09:00:04</Value></Field>
<Field Name="DataDate2" FieldName="DataDate"><FormattedValue>10/02/2020</FormattedValue><Value>2020-02-10</Value></Field>
<Picture Name="Picture1" GraphicType="OLE">
</Picture>
<Text Name="Text13"><TextValue>DELIVERY ADDRESS</TextValue>
</Text>
<Text Name="Text8"><TextValue>SUPPLIER ADDRESS</TextValue>
</Text>
</Section>
<Section SectionNumber="1">
<Text Name="Text5"><TextValue>our details

</TextValue>
</Text>
<Field Name="WHS2" FieldName="{@WHS}"><FormattedValue>customer details
UK</FormattedValue><Value> customer details2
UK</Value></Field>
</Section>
<Section SectionNumber="2">
<Text Name="Text7"><TextValue>IMPORTANT

EACH ORDER REQUIRES A SEPERATE DELIVERY NOTE PER DELIVERY ADDRESS
</TextValue>
</Text>
</Section>
</GroupHeader>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<GroupFooter>
<Section SectionNumber="1">
<CrossTab Name="CrossTab2">
<RowGroups>
<RowGroup>
<RowGroup>
<RowTotal RowNumber="0">PART0</RowTotal>
<RowTotal RowNumber="1">PART1</RowTotal>
<RowTotal RowNumber="2">PART2</RowTotal>
<RowTotal RowNumber="3">PART3</RowTotal>
<RowTotal RowNumber="4">PART4</RowTotal>
<RowTotal RowNumber="5">PART5</RowTotal>
</RowGroup>
</RowGroup>
</RowGroups>
<ColumnGroups>
<ColumnGroup>
<ColumnGroup>
<ColumnTotal ColumnNumber="0"></ColumnTotal>
<ColumnTotal ColumnNumber="1"></ColumnTotal>
<ColumnTotal ColumnNumber="2"></ColumnTotal>
<ColumnTotal ColumnNumber="3"></ColumnTotal>
<ColumnTotal ColumnNumber="4"></ColumnTotal>
<ColumnTotal ColumnNumber="5"></ColumnTotal>

</ColumnGroup>
</ColumnGroup>
</ColumnGroups>
<Cells>
<Cell RowNumber="0" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="1">
<CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="2">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="3">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="4">
<CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="5">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="1" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="1" ColumnNumber="1">
<CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
</Cell>
<Cell RowNumber="1" ColumnNumber="2">
<CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
</Cell>
<Cell RowNumber="1" ColumnNumber="3">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="1" ColumnNumber="4">
<CellValue Index="0"><FormattedValue>20</FormattedValue><Value>20.00</Value></CellValue>
</Cell>
<Cell RowNumber="1" ColumnNumber="5">
<CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
</Cell>
<Cell RowNumber="2" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="2" ColumnNumber="1">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="2" ColumnNumber="2">
<CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
</Cell>
<Cell RowNumber="2" ColumnNumber="3">
<CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
</Cell>
<Cell RowNumber="2" ColumnNumber="4">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="2" ColumnNumber="5">
<CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
</Cell>
<Cell RowNumber="3" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="3" ColumnNumber="1">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="3" ColumnNumber="2">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="3" ColumnNumber="3">
<CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
</Cell>
<Cell RowNumber="3" ColumnNumber="4">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="3" ColumnNumber="5">
<CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
</Cell>
<Cell RowNumber="4" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="4" ColumnNumber="1">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="4" ColumnNumber="2">
<CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
</Cell>
<Cell RowNumber="4" ColumnNumber="3">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="4" ColumnNumber="4">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="4" ColumnNumber="5">
<CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
</Cell>
<Cell RowNumber="5" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="5" ColumnNumber="1">
<CellValue Index="0"><FormattedValue>20</FormattedValue><Value>20.00</Value></CellValue>
</Cell>
<Cell RowNumber="5" ColumnNumber="2">
<CellValue Index="0"><FormattedValue>20</FormattedValue><Value>20.00</Value></CellValue>
</Cell>
<Cell RowNumber="5" ColumnNumber="3">
<CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
</Cell>
<Cell RowNumber="5" ColumnNumber="4">
<CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
</Cell>
<Cell RowNumber="5" ColumnNumber="5">
<CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
</Cell>
</Cells>
</CrossTab>
</Section>
</GroupFooter>
</Group>
<Group Level="1">
<GroupHeader>
<Section SectionNumber="0">
<Text Name="Text4"><TextValue>DELIVERY SCHEDULE</TextValue>
</Text>
<Field Name="DataTime2" FieldName="DataTime"><FormattedValue>09:00:04</FormattedValue><Value>09:00:04</Value></Field>
<Field Name="DataDate2" FieldName="DataDate"><FormattedValue>10/02/2020</FormattedValue><Value>2020-02-10</Value></Field>
<Picture Name="Picture1" GraphicType="OLE">
</Picture>
<Text Name="Text13"><TextValue>DELIVERY ADDRESS</TextValue>
</Text>
<Text Name="Text8"><TextValue>SUPPLIER ADDRESS</TextValue>
</Text>
</Section>
<Section SectionNumber="1">
<Text Name="Text5"><TextValue>our details

</TextValue>
</Text>
<Field Name="WHS2" FieldName="{@WHS}"><FormattedValue>customerdetails2
UK</FormattedValue><Value>customer details 2
UK</Value></Field>
</Section>
<Section SectionNumber="2">
<Text Name="Text7"><TextValue>IMPORTANT

EACH ORDER REQUIRES A SEPERATE DELIVERY NOTE PER DELIVERY ADDRESS
</TextValue>
</Text>
</Section>
</GroupHeader>
<Group Level="2">
</Group>
<GroupFooter>
<Section SectionNumber="1">
<CrossTab Name="CrossTab2">
<RowGroups>
<RowGroup>
<RowGroup>
<RowTotal RowNumber="0">P22031</RowTotal>
</RowGroup>
</RowGroup>
</RowGroups>
<ColumnGroups>
<ColumnGroup>
<ColumnGroup>
<ColumnTotal ColumnNumber="0"></ColumnTotal>
</ColumnGroup>
</ColumnGroup>
</ColumnGroups>
<Cells>
<Cell RowNumber="0" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>4</FormattedValue><Value>4.00</Value></CellValue>
</Cell>
</Cells>
</CrossTab>
</Section>
</GroupFooter>
</Group>
<Group Level="1">
<GroupHeader>
<Section SectionNumber="0">
<Text Name="Text4"><TextValue>DELIVERY SCHEDULE</TextValue>
</Text>
<Field Name="DataTime2" FieldName="DataTime"><FormattedValue>09:00:04</FormattedValue><Value>09:00:04</Value></Field>
<Field Name="DataDate2" FieldName="DataDate"><FormattedValue>10/02/2020</FormattedValue><Value>2020-02-10</Value></Field>
<Picture Name="Picture1" GraphicType="OLE">
</Picture>
<Text Name="Text13"><TextValue>DELIVERY ADDRESS</TextValue>
</Text>
<Text Name="Text8"><TextValue>SUPPLIER ADDRESS</TextValue>
</Text>
</Section>
<Section SectionNumber="1">
<Text Name="Text5"><TextValue>our details

</TextValue>
</Text>
<Field Name="WHS2" FieldName="{@WHS}"><FormattedValue>2nd delivery address
UK</FormattedValue><Value> 2nd delivery address
UK</Value></Field>
</Section>
<Section SectionNumber="2">
<Text Name="Text7"><TextValue>IMPORTANT

EACH ORDER REQUIRES A SEPERATE DELIVERY NOTE PER DELIVERY ADDRESS
</TextValue>
</Text>
</Section>
</GroupHeader>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<Group Level="2">
</Group>
<GroupFooter>
<Section SectionNumber="1">
<CrossTab Name="CrossTab2">
<RowGroups>
<RowGroup>
<RowGroup>
<RowTotal RowNumber="0">Part12</RowTotal>
</RowGroup>
</RowGroup>
</RowGroups>
<ColumnGroups>
<ColumnGroup>
<ColumnGroup>
<ColumnTotal ColumnNumber="0"></ColumnTotal>
<ColumnTotal ColumnNumber="1"></ColumnTotal>
<ColumnTotal ColumnNumber="2"></ColumnTotal>
<ColumnTotal ColumnNumber="3"></ColumnTotal>
<ColumnTotal ColumnNumber="4"></ColumnTotal>
<ColumnTotal ColumnNumber="5"></ColumnTotal>
</ColumnGroup>
</ColumnGroup>
</ColumnGroups>
<Cells>
<Cell RowNumber="0" ColumnNumber="0">
<CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="1">
<CellValue Index="0"><FormattedValue>5</FormattedValue><Value>5.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="2">
<CellValue Index="0"><FormattedValue>5</FormattedValue><Value>5.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="3">
<CellValue Index="0"><FormattedValue>7</FormattedValue><Value>7.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="4">
<CellValue Index="0"><FormattedValue>6</FormattedValue><Value>6.00</Value></CellValue>
</Cell>
<Cell RowNumber="0" ColumnNumber="5">
<CellValue Index="0"><FormattedValue>5</FormattedValue><Value>5.00</Value></CellValue>
</Cell>
</Cells>
</CrossTab>
</Section>
</GroupFooter>
</Group>
<ReportFooter>
<Section SectionNumber="0">
</Section>
</ReportFooter>
</CrystalReport>

更糟糕的是,有两个收货地址,底部部分(只有一个部分)单独列出。看起来这些只是通过送货地址来区分,没有别的。我想我很高兴暂时忽略这一点,除非它很容易解决。

提前致谢。

【问题讨论】:

    标签: sql-server xml tsql


    【解决方案1】:

    我将 XML 文件保存为“e:\Temp\CrystalReport.xml”。您的 XML 具有名称空间,它们需要特殊处理。 WITH XMLNAMESPACES 子句负责处理。

    请参阅下面如何将 XML 文件加载到 DB 表中。

    SQL

    DECLARE @tempTable TABLE (ID INT IDENTITY PRIMARY KEY,  rownumber INT, partnumber NVARCHAR(50));
    
    -- directly from the XML file as a virtual DB table on the file system
    ;WITH XMLNAMESPACES (DEFAULT 'urn:crystal-reports:schemas:report-detail')
    , rs (xmldata) AS
    (
       SELECT TRY_CAST(BulkColumn AS XML) AS BulkColumn 
       FROM OPENROWSET(BULK 'e:\Temp\CrystalReport.xml', SINGLE_BLOB) AS x
    )
    INSERT INTO @tempTable (rownumber, partnumber)
    SELECT c.value('(./@RowNumber)[1]', 'INT') AS RowNumber
        , c.value('(./text())[1]','NVARCHAR(50)') AS RowTotal
    FROM rs AS tbl
       CROSS APPLY tbl.xmldata.nodes('/CrystalReport/Group/GroupFooter/Section/CrossTab/RowGroups/RowGroup/RowGroup/RowTotal') AS t(c);
    
    -- test
    SELECT * FROM @tempTable;
    

    输出

    +----+-----------+------------+
    | ID | rownumber | partnumber |
    +----+-----------+------------+
    |  1 |         0 | PART0      |
    |  2 |         1 | PART1      |
    |  3 |         2 | PART2      |
    |  4 |         3 | PART3      |
    |  5 |         4 | PART4      |
    |  6 |         5 | PART5      |
    |  7 |         0 | P22031     |
    |  8 |         0 | Part12     |
    +----+-----------+------------+
    

    【讨论】:

    • 感谢您抽出宝贵时间创建此内容。它给了我我需要的第一部分。我还需要创建第二个表,其中包含 RowNumber、ColumnNumber 和值,这样我就可以加入这些表来实现我的最终目标。我希望我可以调整您的代码以获得我需要的另一部分,从而将其用作起点。再次感谢。
    【解决方案2】:

    我不会从这个 XML 中阅读全部内容,但是 - 为了向您展示原理 - 我走了一段距离 :-)

    DECLARE @xml XML = 
    N'<CrystalReport xmlns="urn:crystal-reports:schemas:report-detail"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:crystal-reports:schemas:report-detail http://www.businessobjects.com/products/xml/CR2008Schema.xsd">
    <ReportHeader>
    </ReportHeader>
    <Group Level="1">
    <GroupHeader>
    <Section SectionNumber="0">
    <Text Name="Text4"><TextValue>DELIVERY SCHEDULE</TextValue>
    </Text>
    <Field Name="DataTime2" FieldName="DataTime"><FormattedValue>09:00:04</FormattedValue><Value>09:00:04</Value></Field>
    <Field Name="DataDate2" FieldName="DataDate"><FormattedValue>10/02/2020</FormattedValue><Value>2020-02-10</Value></Field>
    <Picture Name="Picture1" GraphicType="OLE">
    </Picture>
    <Text Name="Text13"><TextValue>DELIVERY ADDRESS</TextValue>
    </Text>
    <Text Name="Text8"><TextValue>SUPPLIER ADDRESS</TextValue>
    </Text>
    </Section>
    <Section SectionNumber="1">
    <Text Name="Text5"><TextValue>our details
    
    </TextValue>
    </Text>
    <Field Name="WHS2" FieldName="{@WHS}"><FormattedValue>customer details
    UK</FormattedValue><Value> customer details2
    UK</Value></Field>
    </Section>
    <Section SectionNumber="2">
    <Text Name="Text7"><TextValue>IMPORTANT
    
    EACH ORDER REQUIRES A SEPERATE DELIVERY NOTE PER DELIVERY ADDRESS
    </TextValue>
    </Text>
    </Section>
    </GroupHeader>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <GroupFooter>
    <Section SectionNumber="1">
    <CrossTab Name="CrossTab2">
    <RowGroups>
    <RowGroup>
    <RowGroup>
    <RowTotal RowNumber="0">PART0</RowTotal>
    <RowTotal RowNumber="1">PART1</RowTotal>
    <RowTotal RowNumber="2">PART2</RowTotal>
    <RowTotal RowNumber="3">PART3</RowTotal>
    <RowTotal RowNumber="4">PART4</RowTotal>
    <RowTotal RowNumber="5">PART5</RowTotal>
    </RowGroup>
    </RowGroup>
    </RowGroups>
    <ColumnGroups>
    <ColumnGroup>
    <ColumnGroup>
    <ColumnTotal ColumnNumber="0"></ColumnTotal>
    <ColumnTotal ColumnNumber="1"></ColumnTotal>
    <ColumnTotal ColumnNumber="2"></ColumnTotal>
    <ColumnTotal ColumnNumber="3"></ColumnTotal>
    <ColumnTotal ColumnNumber="4"></ColumnTotal>
    <ColumnTotal ColumnNumber="5"></ColumnTotal>
    
    </ColumnGroup>
    </ColumnGroup>
    </ColumnGroups>
    <Cells>
    <Cell RowNumber="0" ColumnNumber="0">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="1">
    <CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="2">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="3">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="4">
    <CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="5">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="1" ColumnNumber="0">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="1" ColumnNumber="1">
    <CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="1" ColumnNumber="2">
    <CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="1" ColumnNumber="3">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="1" ColumnNumber="4">
    <CellValue Index="0"><FormattedValue>20</FormattedValue><Value>20.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="1" ColumnNumber="5">
    <CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="2" ColumnNumber="0">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="2" ColumnNumber="1">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="2" ColumnNumber="2">
    <CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="2" ColumnNumber="3">
    <CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="2" ColumnNumber="4">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="2" ColumnNumber="5">
    <CellValue Index="0"><FormattedValue>50</FormattedValue><Value>50.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="3" ColumnNumber="0">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="3" ColumnNumber="1">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="3" ColumnNumber="2">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="3" ColumnNumber="3">
    <CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="3" ColumnNumber="4">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="3" ColumnNumber="5">
    <CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="4" ColumnNumber="0">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="4" ColumnNumber="1">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="4" ColumnNumber="2">
    <CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="4" ColumnNumber="3">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="4" ColumnNumber="4">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="4" ColumnNumber="5">
    <CellValue Index="0"><FormattedValue>40</FormattedValue><Value>40.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="5" ColumnNumber="0">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="5" ColumnNumber="1">
    <CellValue Index="0"><FormattedValue>20</FormattedValue><Value>20.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="5" ColumnNumber="2">
    <CellValue Index="0"><FormattedValue>20</FormattedValue><Value>20.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="5" ColumnNumber="3">
    <CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="5" ColumnNumber="4">
    <CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="5" ColumnNumber="5">
    <CellValue Index="0"><FormattedValue>10</FormattedValue><Value>10.00</Value></CellValue>
    </Cell>
    </Cells>
    </CrossTab>
    </Section>
    </GroupFooter>
    </Group>
    <Group Level="1">
    <GroupHeader>
    <Section SectionNumber="0">
    <Text Name="Text4"><TextValue>DELIVERY SCHEDULE</TextValue>
    </Text>
    <Field Name="DataTime2" FieldName="DataTime"><FormattedValue>09:00:04</FormattedValue><Value>09:00:04</Value></Field>
    <Field Name="DataDate2" FieldName="DataDate"><FormattedValue>10/02/2020</FormattedValue><Value>2020-02-10</Value></Field>
    <Picture Name="Picture1" GraphicType="OLE">
    </Picture>
    <Text Name="Text13"><TextValue>DELIVERY ADDRESS</TextValue>
    </Text>
    <Text Name="Text8"><TextValue>SUPPLIER ADDRESS</TextValue>
    </Text>
    </Section>
    <Section SectionNumber="1">
    <Text Name="Text5"><TextValue>our details
    
    </TextValue>
    </Text>
    <Field Name="WHS2" FieldName="{@WHS}"><FormattedValue>customerdetails2
    UK</FormattedValue><Value>customer details 2
    UK</Value></Field>
    </Section>
    <Section SectionNumber="2">
    <Text Name="Text7"><TextValue>IMPORTANT
    
    EACH ORDER REQUIRES A SEPERATE DELIVERY NOTE PER DELIVERY ADDRESS
    </TextValue>
    </Text>
    </Section>
    </GroupHeader>
    <Group Level="2">
    </Group>
    <GroupFooter>
    <Section SectionNumber="1">
    <CrossTab Name="CrossTab2">
    <RowGroups>
    <RowGroup>
    <RowGroup>
    <RowTotal RowNumber="0">P22031</RowTotal>
    </RowGroup>
    </RowGroup>
    </RowGroups>
    <ColumnGroups>
    <ColumnGroup>
    <ColumnGroup>
    <ColumnTotal ColumnNumber="0"></ColumnTotal>
    </ColumnGroup>
    </ColumnGroup>
    </ColumnGroups>
    <Cells>
    <Cell RowNumber="0" ColumnNumber="0">
    <CellValue Index="0"><FormattedValue>4</FormattedValue><Value>4.00</Value></CellValue>
    </Cell>
    </Cells>
    </CrossTab>
    </Section>
    </GroupFooter>
    </Group>
    <Group Level="1">
    <GroupHeader>
    <Section SectionNumber="0">
    <Text Name="Text4"><TextValue>DELIVERY SCHEDULE</TextValue>
    </Text>
    <Field Name="DataTime2" FieldName="DataTime"><FormattedValue>09:00:04</FormattedValue><Value>09:00:04</Value></Field>
    <Field Name="DataDate2" FieldName="DataDate"><FormattedValue>10/02/2020</FormattedValue><Value>2020-02-10</Value></Field>
    <Picture Name="Picture1" GraphicType="OLE">
    </Picture>
    <Text Name="Text13"><TextValue>DELIVERY ADDRESS</TextValue>
    </Text>
    <Text Name="Text8"><TextValue>SUPPLIER ADDRESS</TextValue>
    </Text>
    </Section>
    <Section SectionNumber="1">
    <Text Name="Text5"><TextValue>our details
    
    </TextValue>
    </Text>
    <Field Name="WHS2" FieldName="{@WHS}"><FormattedValue>2nd delivery address
    UK</FormattedValue><Value> 2nd delivery address
    UK</Value></Field>
    </Section>
    <Section SectionNumber="2">
    <Text Name="Text7"><TextValue>IMPORTANT
    
    EACH ORDER REQUIRES A SEPERATE DELIVERY NOTE PER DELIVERY ADDRESS
    </TextValue>
    </Text>
    </Section>
    </GroupHeader>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <Group Level="2">
    </Group>
    <GroupFooter>
    <Section SectionNumber="1">
    <CrossTab Name="CrossTab2">
    <RowGroups>
    <RowGroup>
    <RowGroup>
    <RowTotal RowNumber="0">Part12</RowTotal>
    </RowGroup>
    </RowGroup>
    </RowGroups>
    <ColumnGroups>
    <ColumnGroup>
    <ColumnGroup>
    <ColumnTotal ColumnNumber="0"></ColumnTotal>
    <ColumnTotal ColumnNumber="1"></ColumnTotal>
    <ColumnTotal ColumnNumber="2"></ColumnTotal>
    <ColumnTotal ColumnNumber="3"></ColumnTotal>
    <ColumnTotal ColumnNumber="4"></ColumnTotal>
    <ColumnTotal ColumnNumber="5"></ColumnTotal>
    </ColumnGroup>
    </ColumnGroup>
    </ColumnGroups>
    <Cells>
    <Cell RowNumber="0" ColumnNumber="0">
    <CellValue Index="0"><FormattedValue>0</FormattedValue><Value>0.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="1">
    <CellValue Index="0"><FormattedValue>5</FormattedValue><Value>5.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="2">
    <CellValue Index="0"><FormattedValue>5</FormattedValue><Value>5.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="3">
    <CellValue Index="0"><FormattedValue>7</FormattedValue><Value>7.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="4">
    <CellValue Index="0"><FormattedValue>6</FormattedValue><Value>6.00</Value></CellValue>
    </Cell>
    <Cell RowNumber="0" ColumnNumber="5">
    <CellValue Index="0"><FormattedValue>5</FormattedValue><Value>5.00</Value></CellValue>
    </Cell>
    </Cells>
    </CrossTab>
    </Section>
    </GroupFooter>
    </Group>
    <ReportFooter>
    <Section SectionNumber="0">
    </Section>
    </ReportFooter>
    </CrystalReport>';
    

    --查询

    WITH XMLNAMESPACES(DEFAULT 'urn:crystal-reports:schemas:report-detail')
    ,Level1Groups AS
    (
        SELECT ROW_NUMBER() OVER(ORDER BY A.gr) AS GroupCounter
              ,A.gr.value('@Level','int') AS GroupLevel
              ,A.gr.query('GroupHeader') AS GroupHeader
              ,A.gr.query('Group') AS NestedGroups
              ,A.gr.query('GroupFooter') AS GroupFooter
        FROM @xml.nodes('/CrystalReport/Group') A(gr)
    )
    ,NestedData AS
    (
        SELECT L1gr.*
              ,A.sec.value('@SectionNumber','int') AS SectionNumber
              ,B.CrTab.value('@Name','nvarchar(max)') AS CrossTab_Name
              ,C.rt.value('@RowNumber','int') AS RowNumber
              ,C.rt.value('text()[1]','nvarchar(max)') AS RowLeadText 
              --,B.CrTab.query('ColumnGroups/ColumnGroup/ColumnGroup') AS ColumnGroup
              ,B.CrTab.query('Cells') AS GroupCells
        FROm Level1Groups L1gr
        OUTER APPLY L1gr.GroupFooter.nodes('GroupFooter/Section') A(sec)
        OUTER APPLY A.sec.nodes('CrossTab') B(CrTab)
        OUTER APPLY B.CrTab.nodes('RowGroups/RowGroup/RowGroup/RowTotal') C(rt)
    )
    ,ColumnValues AS
    (
        SELECT *
              ,nd.GroupCells.query('for $c in distinct-values(Cells/Cell[@RowNumber=sql:column("nd.RowNumber")]/@ColumnNumber)
                                   return <val ColumnNumber="{$c}">{Cells
                                               /Cell[@RowNumber=sql:column("nd.RowNumber") 
                                                     and @ColumnNumber=$c]
                                               /CellValue
                                               /FormattedValue
                                               /text()}</val>
                                   ') AS RowValues
        FROM NestedData nd
    )
    /* to see everything returned use this 
    SELECT cv.*
          ,A.vals.value('text()[1]','nvarchar(max)') AS CellValue
    FROM ColumnValues cv
    OUTER APPLY cv.RowValues.nodes('val') A(vals);
    */
    SELECT cv.GroupHeader.value('(//Field[@FieldName="DataDate"]/FormattedValue/text())[1]','nvarchar(max)') As ScheduleDate
          ,cv.RowLeadText
          ,cv.RowNumber
          ,A.vals.value('@ColumnNumber','int') AS ColumnNumber
          ,A.vals.value('text()[1]','nvarchar(max)') AS CellValue
    FROM ColumnValues cv
    OUTER APPLY cv.RowValues.nodes('val') A(vals);
    

    结果

    +--------------+-------------+-----------+--------------+-----------+
    | ScheduleDate | RowLeadText | RowNumber | ColumnNumber | CellValue |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART0       | 0         | 0            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART0       | 0         | 1            | 50        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART0       | 0         | 2            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART0       | 0         | 3            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART0       | 0         | 4            | 50        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART0       | 0         | 5            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART1       | 1         | 0            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART1       | 1         | 1            | 40        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART1       | 1         | 2            | 40        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART1       | 1         | 3            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART1       | 1         | 4            | 20        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART1       | 1         | 5            | 40        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART2       | 2         | 0            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART2       | 2         | 1            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART2       | 2         | 2            | 50        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART2       | 2         | 3            | 50        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART2       | 2         | 4            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART2       | 2         | 5            | 50        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART3       | 3         | 0            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART3       | 3         | 1            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART3       | 3         | 2            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART3       | 3         | 3            | 10        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART3       | 3         | 4            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART3       | 3         | 5            | 10        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART4       | 4         | 0            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART4       | 4         | 1            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART4       | 4         | 2            | 40        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART4       | 4         | 3            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART4       | 4         | 4            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART4       | 4         | 5            | 40        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART5       | 5         | 0            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART5       | 5         | 1            | 20        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART5       | 5         | 2            | 20        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART5       | 5         | 3            | 10        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART5       | 5         | 4            | 10        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | PART5       | 5         | 5            | 10        |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | P22031      | 0         | 0            | 4         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | Part12      | 0         | 0            | 0         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | Part12      | 0         | 1            | 5         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | Part12      | 0         | 2            | 5         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | Part12      | 0         | 3            | 7         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | Part12      | 0         | 4            | 6         |
    +--------------+-------------+-----------+--------------+-----------+
    | 10/02/2020   | Part12      | 0         | 5            | 5         |
    +--------------+-------------+-----------+--------------+-----------+
    

    为了解析 CrossTab,我使用了一些 XQuery FLWOR 返回重新生成的 XML 中的值。

    提示:去掉命名空间(和第一行 WITH),以更易读的格式查看结果。

    我希望这会有所帮助...

    【讨论】:

    • 你显然在这方面遇到了很多麻烦,我真的很感激......不幸的是,大部分这些都完全超出了我的想象,因为我对 xml 非常缺乏经验,只能做基本的sql。您帖子上的输出正是我正在寻找的,但是在 SSMS 中运行您的脚本只会产生很多错误。请问我应该把 XML 文件的路径放在哪里?如果您能帮我把它简化一下,将不胜感激:)
    • @David,您可以使用其他答案的方法将 XML 直接读入表、临时表、声明的表变量或 XML 类型的变量中。一旦您在 SQL-Server 中获得了 XML,您应该能够使用上述内容...如果您需要进一步的帮助,我建议您针对特定错误使用特定问题开始一个新问题。如果这个问题回答了这个最初的问题(至少它会返回您所要求的内容),那么最好通过接受来结束这个问题并使用您的投票权。在您的新问题中放置指向此问题的链接。帮助很快就会到来:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2012-12-18
    • 2013-09-27
    相关资源
    最近更新 更多