我正在尝试使用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已经
答案 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)
我有另一种方式。这对我来说似乎有点容易。 比如说,我有一个像
这样的xmlDECLARE @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
请告诉我这是否有帮助。