需要从MS SQL数据库以XML输出作业单。创建了以下通过传递唯一ID进行调用的存储过程,并将XML输出到目录。这一直很好,但是接收XML的程序现在希望其中一部分具有属性(部分编号)。
使用ROW_NUMBER()
对零件进行编号-但是我不知道如何将其存储为属性。
当前代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EstBinderySig](
[ID] [int] IDENTITY(1,1) NOT NULL,
[EstimateID] [int] NOT NULL,
[EstPartID] [int] NOT NULL,
[EstVersionID] [int] NOT NULL,
CONSTRAINT [PK__EstBinderySig] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EstimatePart](
[ID] [int] IDENTITY(1,1) NOT NULL,
[EstimateID] [int] NOT NULL,
[EstimateProductID] [int] NOT NULL,
[UniquePartNumber] [uniqueidentifier] NOT NULL,
[EstimateHeaderRef] [varchar](32) NULL,
[Name] [varchar](64) NULL,
[FinishedSizeCode] [varchar](32) NULL,
[FinishedSizeWidth] [float] NOT NULL,
[FinishedSizeDepth] [float] NOT NULL,
[Orientation] [bit] NOT NULL,
CONSTRAINT [PK__EstimatePart] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[EstVersions](
[ID] [int] IDENTITY(1,1) NOT NULL,
[EstimateID] [int] NOT NULL,
[Description] [varchar](255) NULL,
[Quantity] [float] NOT NULL,
CONSTRAINT [PK__EstVersions] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MainJobDetails](
[ID] [int] IDENTITY(1,1) NOT NULL,
[JobNo] [varchar](32) NOT NULL,
[InvoiceCustomerCode] [varchar](32) NULL,
[InvoiceCustomerName] [varchar](64) NULL,
[JobType] [varchar](32) NULL,
[JobDesc] [varchar](255) NULL,
[EstimateID] [int] NULL,
CONSTRAINT [PK__MainJobDetails] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
SET IDENTITY_INSERT [dbo].[EstBinderySig] ON;
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269922, 165438, 208492, 150728)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269923, 165438, 208492, 150729)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269924, 165438, 208492, 150730)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269925, 165438, 208492, 150731)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269926, 165438, 208492, 150727)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269927, 165438, 208493, 150732)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269928, 165438, 208493, 150733)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269929, 165438, 208493, 150734)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269930, 165438, 208493, 150735)
INSERT [dbo].[EstBinderySig] ([ID],[EstimateID],[EstPartID],[EstVersionID])
VALUES (1269931, 165438, 208493, 150736)
SET IDENTITY_INSERT [dbo].[EstBinderySig] OFF;
SET IDENTITY_INSERT [dbo].[EstimatePart] ON;
INSERT [dbo].[EstimatePart] ([ID],[EstimateID],[EstimateProductID],[UniquePartNumber], [EstimateHeaderRef],[Name],[FinishedSizeCode],[FinishedSizeWidth],[FinishedSizeDepth], [Orientation])
VALUES (208492,165438, 165422,'61EC545B-9D09-4650-AB25-624BED837AC0','122500','Cover','A5', 148,210,0)
INSERT [dbo].[EstimatePart] ([ID],[EstimateID],[EstimateProductID],[UniquePartNumber], [EstimateHeaderRef],[Name],[FinishedSizeCode],[FinishedSizeWidth],[FinishedSizeDepth], [Orientation])
VALUES (208493,165438, 165422,'DB5A9964-5DFB-48F2-9BD1-F7970D8B2843','122500','Text','A5', 148,210,0)
SET IDENTITY_INSERT [dbo].[EstimatePart] OFF;
SET IDENTITY_INSERT [dbo].[EstVersions] ON;
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150728,165438,'Version 2',1000)
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150729,165438,'Version 3',1000)
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150730,165438,'Version 4',1000)
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150731,165438,'Version 5',1000)
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150732,165438,'Version 1',1000)
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150733,165438,'Version 2',1000)
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150734,165438,'Version 3',1000)
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150735,165438,'Version 4',1000)
INSERT [dbo].[EstVersions] ([ID],[EstimateID],[Description],[Quantity])
VALUES (150736,165438,'Version 5',1000)
SET IDENTITY_INSERT [dbo].[EstVersions] OFF;
SET IDENTITY_INSERT [dbo].[MainJobDetails] ON;
INSERT [dbo].[MainJobDetails] ([ID],[JobNo],[InvoiceCustomerCode],[InvoiceCustomerName] , [JobType], [JobDesc], [EstimateID])
VALUES (65846, '335585', 'XXXXX', 'XXXXX', 'XXXXX', 'XXXXX', 165438)
SET IDENTITY_INSERT [dbo].[MainJobDetails] OFF;
GO
select
[Job].[jobno] AS '@JobNo'
,[Job].[InvoiceCustomerCode] AS '@CustomerCode'
,[dbo].[BCQ_ReplaceAccents]([Job].[JobDesc]) AS '@JobDesc'
,[Job].[JobTypeDesc] AS '@JobType'
,Job.InvoiceCustomerName AS '@InvoiceCustomerName'
,( SELECT COUNT(ID)
FROM EstimatePart
WHERE EstimateID = Job.EstimateID) AS '@NoOfParts'
,ROW_NUMBER() OVER(ORDER BY [Part].[ID] ASC) AS '@PartNo'
,[Part].[Name] AS 'PartName'
,CAST([Part].[FinishedSizeWidth] AS decimal(10,2)) AS 'Width'
,CAST([Part].[FinishedSizeDepth] AS decimal(10,2)) AS 'Depth'
,CASE WHEN [Part].[Orientation] = 0 THEN 'P' ELSE 'L' END AS 'Orientation'
,CASE WHEN Part.ProcessInksBack + Part.SpotInksBack + Part.MetallicInksBack = 0 then Part.totalpages/2 else Part.totalpages END AS 'PartPages'
,[Part].[Description] AS 'StockType'
,[Part].[ProcessInksFront] AS 'ProcessInkFront'
,[Part].[ProcessInksBack] AS 'ProcessInkBack'
,[Part].[SpotInksFront] + [Part].[MetallicInksFront] AS 'SpotColoursFront'
,[Part].[SpotInksBack] + [Part].[MetallicInksBack] AS 'SpotColoursBack'
,( SELECT CONCAT([Version].[Description],' ',[Version].[Quantity])
FROM [dbo].[EstBinderySig] [VersionLink] WITH (NOLOCK)
INNER JOIN [dbo].[EstVersions] [Version] WITH (NOLOCK)
ON [VersionLink].[EstVersionID] = [Version].[ID]
WHERE [VersionLink].[EstimateID] = [Job].[EstimateID] AND [VersionLink].[EstPartID] = [Part].[ID]
ORDER BY [VersionLink].[ID] ASC
FOR XML AUTO, TYPE, ELEMENTS
) AS 'Version'
FROM
[dbo].[MainJobDetails] [Job]
INNER JOIN [dbo].[EstimatePart] [Part]
ON [Job].[EstimateID] = [Part].[EstimateID]
WHERE Job.ID = @recordid
FOR XML PATH('Part');
现在提供以下XML输出:
<Part JobNo="XXXXX" IssueNumber="3" CustomerCode="XXXXX" Contact="XXXXX" JobDesc="Sample stitched brochure - versions" DespatchDate="2018-11-23T18:00:00" JobType="Stitched brochure" QTYOrdered="5000" InvoiceCustomerName="XXXXX" ProofType="PDF" NoOfParts="2" Versions="5" TotalPages="100" JobCreator="XXXXX" JobCreatorEmail="XXXXX" Site="XXXXX" Method="XXXXX" DieRef="XXXXX" PartNo="1">
<PartName>Cover</PartName>
<Width>148.00</Width>
<Depth>210.00</Depth>
<Orientation>P</Orientation>
<PartPages>4</PartPages>
<StockType>Chorus Lux Silk 300gsm</StockType>
<ProcessInkFront>4</ProcessInkFront>
<ProcessInkBack>4</ProcessInkBack>
<SpotColoursFront>0</SpotColoursFront>
<SpotColoursBack>0</SpotColoursBack>
<Version>
<VersionLink>Version 2 1000</VersionLink>
<VersionLink>Version 3 1000</VersionLink>
<VersionLink>Version 4 1000</VersionLink>
<VersionLink>Version 5 1000</VersionLink>
<VersionLink>Version 1 1000</VersionLink>
</Version>
</Part>
<Part JobNo="XXXXX" IssueNumber="3" CustomerCode="XXXXX" Contact="XXXXX" JobDesc="Sample stitched brochure - versions" DespatchDate="2018-11-23T18:00:00" JobType="Stitched brochure" QTYOrdered="5000" InvoiceCustomerName="XXXXX" ProofType="PDF" NoOfParts="2" Versions="5" TotalPages="100" JobCreator="XXXXX" JobCreatorEmail="XXXXX" Site="XXXXX" Method="XXXXX" DieRef="XXXXX" PartNo="2">
<PartName>Text</PartName>
<Width>148.00</Width>
<Depth>210.00</Depth>
<Orientation>P</Orientation>
<PartPages>16</PartPages>
<ProcessInkFront>4</ProcessInkFront>
<ProcessInkBack>4</ProcessInkBack>
<SpotColoursFront>0</SpotColoursFront>
<SpotColoursBack>0</SpotColoursBack>
<Version>
<VersionLink>Version 1 1000</VersionLink>
<VersionLink>Version 2 1000</VersionLink>
<VersionLink>Version 3 1000</VersionLink>
<VersionLink>Version 4 1000</VersionLink>
<VersionLink>Version 5 1000</VersionLink>
</Version>
</Part>
所需的输出是:
<Job>
<jobno>XXXXX</jobno>
<IssueNumber>3</IssueNumber>
<CustomerCode>XXXXX</CustomerCode>
<Contact>XXXXX</Contact>
<JobDesc>Sample stitched brochure - versions</JobDesc>
<DespatchDate>2018-11-23T18:00:00</DespatchDate>
<JobType>Stitched brochure</JobType>
<QTYOrdered>5000</QTYOrdered>
<InvoiceCustomerName>XXXXX</InvoiceCustomerName>
<ProofType>PDF</ProofType>
<NoOfParts>2</NoOfParts>
<Versions>5</Versions>
<TotalPages>100</TotalPages>
<JobCreator>XXXXX</JobCreator>
<JobCreatorEmail>XXXXX</JobCreatorEmail>
<Site>XXXXX</Site>
<Method>XXXXX</Method>
<DieRef>N/A</DieRef>
<Part PartNo="1">
<PartName>Cover</PartName>
<Width>148.00</Width>
<Depth>210.00</Depth>
<Orientation>P</Orientation>
<PartPages>4</PartPages>
<StockType>Chorus Lux Silk 300gsm</StockType>
<ProcessInkFront>4</ProcessInkFront>
<ProcessInkBack>4</ProcessInkBack>
<SpotColoursFront>0</SpotColoursFront>
<SpotColoursBack>0</SpotColoursBack>
<Version>
<VersionLink>Version 2 1000</VersionLink>
<VersionLink>Version 3 1000</VersionLink>
<VersionLink>Version 4 1000</VersionLink>
<VersionLink>Version 5 1000</VersionLink>
<VersionLink>Version 1 1000</VersionLink>
</Version>
</Part>
<Part PartNo="2">
<PartName>Text</PartName>
<Width>148.00</Width>
<Depth>210.00</Depth>
<Orientation>P</Orientation>
<PartPages>16</PartPages>
<ProcessInkFront>4</ProcessInkFront>
<ProcessInkBack>4</ProcessInkBack>
<SpotColoursFront>0</SpotColoursFront>
<SpotColoursBack>0</SpotColoursBack>
<Version>
<VersionLink>Version 1 1000</VersionLink>
<VersionLink>Version 2 1000</VersionLink>
<VersionLink>Version 3 1000</VersionLink>
<VersionLink>Version 4 1000</VersionLink>
<VersionLink>Version 5 1000</VersionLink>
</Version>
</Part>
</Job>
答案 0 :(得分:0)
在别名的名称前放置@
。请注意,该属性必须在之前。作为一个简单的示例:
SELECT 1 AS [@Partno],
'test' AS Test
FOR XML PATH('item'),ROOT('job');
这将返回值:
<job>
<item Partno="1">
<Test>test</Test>
</item>
</job>
但是,如果您要尝试:
SELECT 'test' AS Test,
1 AS [@Partno]
FOR XML PATH('item'),ROOT('job');
您将收到错误:
以属性为中心的列'@Partno'不能出现在FOR XML PATH中XML层次结构中以非属性为中心的同级之后。