【问题标题】:Exporting a xml document from sql 2008从 sql 2008 导出 xml 文档
【发布时间】:2014-07-16 10:09:20
【问题描述】:

全部

我对xml的经验很少,所以请温柔。

情况是我们使用一个名为 dataswitch 的应用程序来获取 xml 并通过业务对象将其处理到我们的 ERP 系统中。

我试图重新创建的输出如下来自示例 xml 文档。

**<?xml version="1.0" encoding="Windows-1252" ?> 
- <IssueDetails Language="05" CssStyle="" DecFormat="1" DateFormat="01" Role="01" Version="6.0.000">**
- <Item>
  <Job>00000121</Job> 
  <NonStocked>N</NonStocked> 
  <Warehouse>RM</Warehouse> 
  <StockCode>BBMB100</StockCode> 
  <Line>00</Line> 
  <QuantityToIssue>1.000</QuantityToIssue> 
  </Item>
  </IssueDetails>

到目前为止,我一直在使用 For xml Path 方法来构建我的查询,并使用了从 Phil Factorwrite the output 的 sp

到目前为止,我已经成功创建了一个在浏览器中打开的 xml 文档(需要多次尝试!)

这是我设法创建的输出,请注意顶行不同

**<IssueDetails xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">**
- <Item>
  <Job>00044816</Job> 
  <NonStocked>N</NonStocked> 
  <Warehouse>C2</Warehouse> 
  <StockCode>FG00707</StockCode> 
  <Line>00</Line> 
  <QuantityToIssue>400.000000000</QuantityToIssue> 
  </Item>
- <Item>
  <Job>00044816</Job> 
  <NonStocked>N</NonStocked> 
  <Warehouse>C2</Warehouse> 
  <StockCode>FG00707</StockCode> 
  <Line>00</Line> 
  <QuantityToIssue>10.000000000</QuantityToIssue> 
  </Item>
</IssueDetails>

所以我的问题是如何让输出中的第一行与示例输出相同?

下面列出了我的程序

Declare 
    @XML_1 varchar (max),
    @myXML varchar(max),
    @myFile varchar (30),
    @Path varchar (100)

set @XML_1=''
set @myFile ='MaterialIssuesTest.xml'
set @Path='D:\Temp\'


--Query database for materials
Set @XML_1 =@XML_1 + (  SELECT WJM.[Job]

            ,Case when WJM.[Warehouse]='**' then 'Y' else 'N' end as NonStocked
            ,WJM.[Warehouse]
            ,rtrim(LP.StockCode) as StockCode
            ,WJM.[Line]
            ,[UnitQtyReqd]*LP.LQtyComplete as QuantityToIssue
            FROM [SysproCompanyR].[dbo].[WipJobAllMat] WJM 
            inner join CHC_Production.LabPostsAtMileOps LP On WJM.Job=LP.Job 
            Where WJM.Job in ('00044816')and (WJM.OperationOffset > LP.PrevOp
            and WJM.OperationOffset<LP.LOperation)
            FOR XML Path ('Item'),ROOT ('IssueDetails'), ELEMENTS XSINIL 
            )
set @myXML = LTRIM(rtrim(@XML_1))
--Debug print xml
Print @myXML
--Output xml to document
execute     dbo.spWriteStringToFile @myXML, @Path, @myFile
GO

【问题讨论】:

    标签: sql sql-server xml sql-server-2008


    【解决方案1】:

    要获得第一行,它是主体的子元素,您需要像我在下面所做的那样进行子查询。要获得属性,您需要用 @ 符号命名它们,在我的示例中也是如此(格式更改以帮助我设置它!):

    SET @XML_1 =@XML_1 + 
        (  
        SELECT WJM.[Job],
               (
               SELECT '' AS '@Language',
                      '' AS '@CssStyle',
                      '' AS '@DecFormat',
                      '' AS '@DateFormat',
                      '' AS '@Role',
                      '' AS '@Version'
               FROM   YOURTABLENAME YTN
               WHERE  YTN.[SOMEFIELD] = WJM.[SOMEFIELD]
               FOR    XML PATH(''), TYPE
               ) AS 'IssueDetails'
    
              ,Case when WJM.[Warehouse]='**' then 'Y' else 'N' end as NonStocked
              ,WJM.[Warehouse]
              ,rtrim(LP.StockCode) as StockCode
              ,WJM.[Line]
              ,[UnitQtyReqd]*LP.LQtyComplete as QuantityToIssue
        FROM  [SysproCompanyR].[dbo].[WipJobAllMat] WJM 
        INNER JOIN CHC_Production.LabPostsAtMileOps LP ON WJM.Job = LP.Job 
        WHERE   WJM.Job IN ('00044816') AND (WJM.OperationOffset > LP.PrevOp
            AND WJM.OperationOffset<LP.LOperation)
        FOR XML Path ('Item'), ROOT ('IssueDetails'), ELEMENTS XSINIL 
        )
    

    我不知道数据是从哪里来的,所以你必须填写表名和WHERE 子句才能将它加入到你已经拥有的数据中。这是假设数据是您已经提供的数据的子数据。

    请记住,语法可能不太正确,因为我是从记忆中执行此操作的,并且有几种不同的变体可以得到此结果。

    【讨论】:

    • 太好了,您提供的子查询中的数据目前是静态的,因此更容易做到!非常感谢,我会在午餐时试一试
    • 让我知道你是怎么做的。有任何问题,我会尽力为你整理语法。