【问题标题】:For XML Custom Attribute and Element in SQL ServerSQL Server 中的 XML 自定义属性和元素
【发布时间】:2017-08-23 06:06:30
【问题描述】:

我需要使用硬编码数据创建一个带有自定义元素的以下 XML。

表格架构:StudentMark

CREATE TABLE [dbo].[StudentMark]
(
    [StudentMarkId] [int] IDENTITY(1,1) NOT NULL,
    [StudentId] [uniqueidentifier] NOT NULL,
    [SubjectId] [uniqueidentifier] NOT NULL,
    [Score] [int] NOT NULL,
    [ScoreInfo] [xml] NOT NULL,
    [GeneratedOn] [datetime2](2) NOT NULL,
    [IsPass] [bit] NOT NULL,
    CONSTRAINT [PK_StudentMark] 
       PRIMARY KEY CLUSTERED ([StudentMarkId] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

样本种子数据

INSERT INTO [dbo].[StudentMark] ([StudentId], [SubjectId], [ScoreInfo], [GeneratedOn], [Score], [IsPass])
VALUES ('FC3CB475-B480-4129-9190-6DE880E2D581', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:10:15', 95, 1),
       ('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:10:15', 100, 1),
       ('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20', 25, 0),
       ('FC3CB475-B480-4129-9190-6DE880E2D581', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20', 82, 1);

要求:我需要在 XML 中添加一个元素 &lt;DigitallySigned&gt;,XML 是一个使用 where 子句 WHERE [StudentMarkId] = 1 的记录。请看下面的模板,属性DateSigned与元素GeneratedOndateTime完全相同,元素Admin的值是硬编码的值。

XML 模板

<ScoreInfo>
    <DigitallySigned DateSigned="2017-08-10 10:10:15">Admin</DigitallySigned>
    <StudentMarkId>1</StudentMarkId>
    <StudentId>FC3CB475-B480-4129-9190-6DE880E2D581</StudentId>
    <SubjectId>0D72F79E-FB48-4D3E-9906-B78A9D105081</SubjectId>
    <Score>95</Score>
    <GeneratedOn>2017-08-10 10:10:15</GeneratedOn>
    <IsPass>1</IsPass>
</ScoreInfo>

我尝试了以下代码

SELECT TOP (1) 
    (SELECT SM.[GeneratedOn] AS [DateSigned] FOR XML RAW)
      ,SM.[StudentMarkId]
      ,SM.[StudentId]
      ,SM.[SubjectId]
      ,SM.[Score]
      ,SM.[GeneratedOn]
      ,SM.[IsPass]
  FROM [DevDB].[dbo].[StudentMark] SM
  WHERE SM.[StudentMarkId] = 1
  FOR XML RAW ('ScoreInfo'), ELEMENTS

我得到了以下 XML 输出

<ScoreInfo>&lt;row DateSigned="2017-08-10T10:10:15"/&gt;<StudentMarkId>1</StudentMarkId><StudentId>FC3CB475-B480-4129-9190-6DE880E2D581</StudentId><SubjectId>0D72F79E-FB48-4D3E-9906-B78A9D105081</SubjectId><Score>95</Score><GeneratedOn>2017-08-10T10:10:15</GeneratedOn><IsPass>1</IsPass></ScoreInfo>

请帮助我如何获得所需的XML

【问题讨论】:

    标签: sql sql-server xml sql-server-2016 for-xml-path


    【解决方案1】:

    来了。

    SELECT TOP (1) 
        [GeneratedOn] AS "DigitallySigned/@DateSigned",
        'Admin' AS "DigitallySigned"
          ,SM.[StudentMarkId]
          ,SM.[StudentId]
          ,SM.[SubjectId]
          ,SM.[Score]
          ,SM.[GeneratedOn]
          ,SM.[IsPass]
      FROM [DevDB].[dbo].[StudentMark] SM
      WHERE SM.[StudentMarkId] = 1
      FOR XML PATH ('ScoreInfo');
    

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多