从sql 2008导出xml文档

从sql 2008导出xml文档,sql,sql-server,xml,sql-server-2008,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" Ver

全部

我对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>
到目前为止,我一直在使用forxml路径方法构建查询,并使用sp from to

到目前为止,我已经成功地创建了一个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

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

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子句才能将其连接到已有的数据。这是假设数据是您已经提供的数据的子数据


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

这太好了。您提供的子查询的数据当前是静态的,因此更容易执行!非常感谢,我会给它一个检查过的午餐,让我知道你的进展如何。如果有任何问题,我将尝试为您整理语法。