从sql 2008导出xml文档

时间:2014-07-16 10:09:20

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

所有

我对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

1 个答案:

答案 0 :(得分:0)

为了获得第一行,这是主体的子元素,您需要像我在下面所做的那样进行子查询。要获取属性,您需要使用@符号命名它们,再次在我的示例中(格式化更改以帮助我将其设置出来!):

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子句以将其加入到您已有的数据中。假设数据是您已经提供的数据的子项。

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