TSQL-在输出AUTO,TYPE,ELEMENTS时将属性添加到XML

时间:2019-01-31 10:54:31

标签: sql-server xml tsql stored-procedures

需要从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>

1 个答案:

答案 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层次结构中以非属性为中心的同级之后。