在具有相同元素名称的FOR XML Path T-SQL查询中多次使用属性

时间:2014-07-24 21:45:40

标签: sql-server xml sql-server-2008

我正在尝试使用FOR XML Path在SQL 2008中创建xml输出。这很好用:

<Taxonomy>
      <Category Level="1">Clothing</Category>
      <SubCategory Level="2">Jeans</SubCategory>
 </Taxonomy>

但我希望输出为:

<Taxonomy>
      <Category Level="1">Clothing</Category>
      <Category Level="2">Jeans</Category>
</Taxonomy>

当然,您可以编写如下代码:

1 as 'Taxonomy/Category/@Level',
2 as 'Taxonomy/Category/@Level',
t.MainCat as 'Taxonomy/Category', 
t.SubCat as 'Taxonomy/Category',

但是这会给出一条错误消息: 以属性为中心的列&#39;重复列名称。在同一个XML标记上不能多次生成相同的属性。

可以做些什么来获得所需的输出? 子选择是否适用或某种交叉适用?或者也许是工会?但是如何?

----编辑 - 经过多次回答后得出以下解决方案:

SELECT 
1 as 'Category/@Level',
t.Cat as 'Category'
FROM table t

UNION

SELECT 
2 as 'Category/@Level',
t.SubCat as 'Category'
FROM table t

FOR XML PATH (''), ROOT('Taxonomy')

给出了这个输出:

<Taxonomy>
  <Category Level="1">Clothing</Category>
  <Category Level="2">Jeans</Category>
</Taxonomy>

还是要弄清楚如何将这个部分编码放在一个更大的代码中,其中包含几个嵌套的代码。对于XML已经

3 个答案:

答案 0 :(得分:2)

快捷方法可能不会为此删除它。 AUTO和PATH不喜欢具有相同名称的多个元素。看起来你必须使用FOR XML EXPLICIT命令。

它有效,但很麻烦。

样品:

--Generate Sample Data
--FOR XML EXPLICIT requires two meta fields: Tag and Parent
--Tag is the ID of the current element.
--Parent is the ID of the parent element, or NULL for root element.

DECLARE @DataTable as table
   (Tag int NOT NULL
   , Parent int
   , TaxonomyValue nvarchar(max)
   , CategoryValue nvarchar(max)
   , CategoryLevel int)

--Fill with sample data: Category Element (2), under Taxonomy(1), with no Taxonomy value.
INSERT INTO @DataTable
VALUES (2, 1, NULL, 1, 'Clothing')
     , (2, 1, NULL, 2, 'Jeans')

--First part of query: Define the XML structure
SELECT
   1 as Tag  --root element
   , NULL as Parent
   , NULL as [Taxonomy!1]       --Assign Taxonomy Element to the first element, aka root.
   , NULL as [Category!2]       --Assign Category Element as a child to Taxonomy.
   , NULL as [Category!2!Level] --Give Category an Attribute 'Level'

--The actual data to fill the XML
UNION
SELECT
   Data.Tag
   , Data.Parent
   , Data.TaxonomyValue
   , Data.CategoryValue
   , Data.CategoryLevel
FROM
   @DataTable as Data
FOR XML EXPLICIT

生成XML

<Taxonomy>
  <Category Level="1">Clothing</Category>
  <Category Level="2">Jeans</Category>
</Taxonomy>

编辑:列已颠倒。不再是牛仔裤了。

答案 1 :(得分:1)

我知道这是一篇旧帖子,但我想分享一个解决方案,避免使用FOR XML EXPLICIT命令复杂的大xmls。

将null作为Taxonomy的子级添加就足够了,错误将消失:

    select 1 as 'Taxonomy/Category/@Level',
           t.MainCat as 'Taxonomy/Category',
           NULL AS 'Taxonomy/*',
           2 as 'Taxonomy/Category/@Level',
           t.SubCat as 'Taxonomy/Category',
    from t

我希望它有所帮助。

答案 2 :(得分:0)

我有另一种方式。这对我来说似乎有点容易。 比如说,我有一个像

这样的xml
DECLARE @xml xml='<parameters></parameters>'

DECLARE @multiplenodes XML = '<test1><test2 Level="1">This is a test node 2</test2><test2 Level="2">This is another test node</test2></test1>'

SET @xml.modify('insert sql:variable("@multiplenodes") into (/parameters)[1]')

SELECT @xml

请告诉我这是否有帮助。