TSQL for xml标记只需一次

TSQL for xml标记只需一次,xml,tsql,Xml,Tsql,我有以下选择查询: SELECT '2012' 'period', Person.Name 'users/person' FROM Person FOR XML PATH(''), ROOT ('company') 这为我提供了以下XML: <company> <period>2012</period> <users> <person>Dubach</person> </users> &

我有以下选择查询:

SELECT
'2012' 'period',
Person.Name 'users/person'
FROM Person
FOR XML PATH(''), ROOT ('company')
这为我提供了以下XML:

<company>
  <period>2012</period>
  <users>
    <person>Dubach</person>
  </users>
  <period>2012</period>
  <users>
    <person>Pletscher</person>
  </users>
  <period>2012</period>
  ....

我希望在结果XML的开头只使用一次句号标记。如何实现这一点?

您可以使用显式模式以任意方式塑造它:

DECLARE @period XML = '<period>2012</period>'
DECLARE @xml XML = (
        SELECT 
        Person.Name 'users/person'
        FROM Person
        FOR XML PATH(''), ROOT ('company')
    )

SET @xml.modify('insert sql:variable("@period") as first into (/company)[1]')

SELECT @xml
CREATE TABLE #person (
    name VARCHAR(10)
)

INSERT #person VALUES ('One')
INSERT #person VALUES ('Two')
INSERT #person VALUES ('Three')
INSERT #person VALUES ('Four')
INSERT #person VALUES ('Five')

SELECT
    1 AS Tag,
    NULL AS Parent,
    '2012' AS [company!1!period!ELEMENT],
    NULL AS [users!2!person!ELEMENT]
FROM
    (SELECT 1 AS fake) AS data
UNION ALL
SELECT
    2 AS Tag,
    1 AS Parent,
    '2012',
    P.name
FROM
    #person P
FOR XML EXPLICIT

您可以使用显式模式以任意方式对其进行造型:

CREATE TABLE #person (
    name VARCHAR(10)
)

INSERT #person VALUES ('One')
INSERT #person VALUES ('Two')
INSERT #person VALUES ('Three')
INSERT #person VALUES ('Four')
INSERT #person VALUES ('Five')

SELECT
    1 AS Tag,
    NULL AS Parent,
    '2012' AS [company!1!period!ELEMENT],
    NULL AS [users!2!person!ELEMENT]
FROM
    (SELECT 1 AS fake) AS data
UNION ALL
SELECT
    2 AS Tag,
    1 AS Parent,
    '2012',
    P.name
FROM
    #person P
FOR XML EXPLICIT

您可以在子选择中嵌套用户/个人元素的创建,然后在其周围创建外部XML:

declare @Person table (Name varchar(10))
insert into @Person values ('Bob'),('Harry')

SELECT
'2012' 'period',
(SELECT p.Name 'users/person'
FROM @Person p
FOR XML PATH(''), TYPE
)
FOR XML PATH(''), ROOT ('company')

您可以在子选择中嵌套用户/个人元素的创建,然后在其周围创建外部XML:

declare @Person table (Name varchar(10))
insert into @Person values ('Bob'),('Harry')

SELECT
'2012' 'period',
(SELECT p.Name 'users/person'
FROM @Person p
FOR XML PATH(''), TYPE
)
FOR XML PATH(''), ROOT ('company')