所有
我对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 Factor到write 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
答案 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
子句以将其加入到您已有的数据中。假设数据是您已经提供的数据的子项。
请记住,语法可能不太正确,因为我在内存中执行此操作,并且有几种不同的变体可以获得此结果。