У меня есть база данных с 5 таблицами. 3 таблицы подключаются.Создание динамического многоуровневого XML-файла из таблицы SQL Server
Создайте таблицу, в которой все данные будут объединены. В этой таблице есть столбец GroupLevel, который имеет затем уровень nr. Каждый уровень имеет следующий нижний уровень, например. группа 1 имеет группу 2.
Первые из моих таблиц содержат продукты:
ProductID ProductLanguageID ProductDefaultShopID ProductNumber ProductName ProductPrice
[email protected]@SHOP1 LANG2 SHOP1 100101 AAA 159,61
[email protected]@SHOP1 LANG2 SHOP1 100102 BBB 159,61
[email protected]@SHOP1 LANG2 SHOP1 100105 CCC 159,61
вторых имеют группы:
GroupID GroupLanguageID GroupName GroupNumber
[email protected]@SHOP1 LANG2 ABC 1
[email protected]@SHOP1 LANG2 BCD 1.01
[email protected]@SHOP1 LANG2 CDE 1.02
[email protected]@SHOP1 LANG2 DEF 1.03
третьих язык
LanguageID LanguageCode2 LanguageName LanguageNativeName
LANG1 En English English
LANG2 De German Deutsch
Я также 2 таблицы, которые не имеют никаких подключений к другим таблицам:
отношения Группа Таблица
GroupRelationsGroupID GroupRelationsParentID
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
Группа Соотношение продукта Таблица
GroupProductRelationGroupID GroupProductRelationProductID
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
Я создал одну таблицу, где объединены все данные. Эта таблица имеет столбец GroupLevel, который содержит уровень nr. Каждый уровень имеет следующий нижний уровень, например. группа 1 имеет группу 2, как и в таблице ниже
GroupLevel GroupID GroupLanguageID GroupName GroupNumber ParentGroupID GroupProductRelationGroupID GroupProductRelationProductID ProductID ProductLanguageID ProductNumber ProductName ProductPrice
1 [email protected]@SHOP1 LANG2 ABC 1 NULL NULL NULL NULL NULL NULL NULL NULL
2 [email protected]@SHOP1 LANG2 BCD 1.01 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 457163 ProductName 299,81
2 [email protected]@SHOP1 LANG2 BCD 1.01 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 457162 ProductName 163,14
2 [email protected]@SHOP1 LANG2 DEF 1.03 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 159151 ProductName 10
2 [email protected]@SHOP1 LANG2 DEF 1.03 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 159150 ProductName 10
2 [email protected]@SHOP1 LANG2 DEF 1.02 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 159122 ProductName 309,35
3 [email protected]@SHOP1 LANG2 GGG 1.13 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1LANG2 3459652 ProductName 309,35
4 [email protected]@SHOP1 LANG2 BBB 1.14 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 564326 ProductName 309,35
Мой вопрос заключается в том, чтобы создать динамический XML-файл с макс 3 уровня, где все элементы на уровнях после третьего объеденены к (входит в) 3 уровень. Мне также нужно, чтобы каждый элемент этих уровней (те, что слились с третьим) имел атрибут, который говорит/показывает, на каком уровне они первоначально принадлежали. Так, например, если бы у меня было 5 уровней, а уровни 4 и 5, слитые в 3-й уровень, все элементы уровня 4 должны иметь тег, говорящий «ранее на уровне 4» и с уровня 5 «ранее на уровне 5». Это должно работать независимо от количества уровней.
Я создал код, но он не работает, как требуется
SELECT lvl1.GroupName AS groupName, lvl1.GroupNumber
,(
SELECT prod1.ProductName AS itemName
,prod1.ProductNumber AS itemNumber,
prod1.ProductPrice AS itemPrice,
prod1.GroupID,
prod1.GroupName
FROM #tmpFullResult AS prod1
WHERE prod1.GroupLevel=1
AND prod1.GroupID=lvl1.GroupID
FOR XML PATH('product'),ROOT('products'),TYPE
)
,(
SELECT lvl2.GroupName AS groupName, lvl2.GroupNumber
,(
SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber
,prod.ProductPrice AS itemPrice
FROM #tmpFullResult AS prod
WHERE prod.ProductID IS NOT NULL
AND prod.GroupLevel=2
AND prod.ProductID=lvl2.ProductID
AND prod.GroupID=lvl2.GroupID
FOR XML PATH('product'),ROOT('products'),TYPE
)
FROM #tmpFullResult AS lvl2
WHERE lvl2.GroupLevel=2
AND lvl2.ParentGroupID=lvl1.GroupID
group by lvl2.GroupName , lvl2.GroupNumber,lvl2.GroupID, lvl2.ProductID
FOR XML PATH('productGroup2'),TYPE
)
FROM #tmpFullResult AS lvl1
WHERE lvl1.ParentGroupID IS NULL
group by lvl1.GroupName , lvl1.GroupNumber,lvl1.GroupID, lvl1.ProductID
FOR XML PATH('productgroup1'),ROOT('root')
GO
пример того, как мне нужно сделать:
select '<?xml version="1.0" encoding="ISO-8859-1" ?>' +
(
SELECT lvl1.GroupName AS groupName
,(
SELECT prod1.ProductName, prod1.ProductNumber AS itemNumber
,prod1.ProductPrice AS itemPrice
FROM tmpFullResultInDesign AS prod1
WHERE prod1.ProductID IS NOT NULL
AND prod1.GroupLevel=1
AND prod1.ProductID=lvl1.ProductID
AND prod1.GroupID=lvl1.GroupID
FOR XML PATH('productLevel_1'),ROOT('products'),TYPE
)
,(
SELECT lvl2.GroupName AS 'GroupName'
,(
SELECT prod2.ProductName AS ProductName ,prod2.ProductNumber AS itemNumber
,prod2.ProductPrice AS itemPrice, prod2.GroupID
FROM tmpFullResultInDesign AS prod2
WHERE prod2.ProductID IS NOT NULL
AND prod2.GroupLevel=2
AND prod2.ProductID=lvl2.ProductID
AND prod2.GroupID=lvl2.GroupID
order by groupName
FOR XML PATH('productLevel_2'),ROOT('products'),TYPE
)
,(
SELECT lvl3.GroupName AS groupName
,(
SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber
,prod.ProductPrice AS itemPrice
FROM tmpFullResultInDesign AS prod
WHERE prod.ProductID IS NOT NULL
AND prod.GroupLevel=3
AND prod.ProductID= lvl3.ProductID
AND prod.GroupID=lvl3.GroupID
FOR XML PATH('productLevel_3'),ROOT('products'),TYPE
)
,(
SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber
,prod.ProductPrice AS itemPrice
FROM tmpFullResultInDesign AS prod
WHERE prod.ProductID IS NOT NULL
AND prod.GroupLevel=3
FOR XML PATH('productLevel_previously_level_4'),ROOT('products'),TYPE
)
,(
SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber
,prod.ProductPrice AS itemPrice
FROM tmpFullResultInDesign AS prod
WHERE prod.ProductID IS NOT NULL
AND prod.GroupLevel=5
FOR XML PATH('productLevel_previously_level_5'),ROOT('products'),TYPE
)
FROM tmpFullResultInDesign AS lvl3
WHERE lvl3.GroupLevel=3
AND lvl3.ParentGroupID=lvl2.GroupID
FOR XML PATH('productGroup3'),TYPE, ELEMENTS
)
FROM tmpFullResultInDesign AS lvl2
WHERE lvl2.GroupLevel=2
AND lvl2.ParentGroupID=lvl1.GroupID
order by lvl2.GroupName
FOR XML PATH('productGroup2'),TYPE, ELEMENTS
)
FROM tmpFullResultInDesign AS lvl1
WHERE lvl1.ParentGroupID IS NULL
order by GroupNumber
FOR XML PATH('productGroup1'),ROOT('root')
)
Вывод в XML Как в этом примере:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<productGroup1>
<groupName>Kosmetik</groupName>
<productGroup2>
<GroupName>Face</GroupName>
<products>
<productLevel_2 id="Product1">
<ProductName>AAAAA!</ProductName>
<itemNumber>457162</itemNumber>
<itemPrice>1.02</itemPrice>
<GroupID>[email protected]@SHOP1</GroupID>
</productLevel_2>
<productLevel_2 id="Product2">
<ProductName>BBBBB!</ProductName>
<itemNumber>43434234</itemNumber>
<itemPrice>134.3434</itemPrice>
<GroupID>[email protected]@SHOP1</GroupID>
</productLevel_2>
</products>
<productGroup3>
<groupName>FFFFFFF</groupName>
<products>
<productLevel_3 id="Product1">
<itemNumber>[email protected]</itemNumber>
<itemPrice>1.230000000000000e+002</itemPrice>
</productLevel_3>
</products>
<products>
<productLevel_previously_level_4 id="Product1">
<itemNumber>23234545</itemNumber>
<itemPrice>34.676</itemPrice>
</productLevel_previously_level_4>
<productLevel_previously_level_4 id="Product2">
<itemNumber>23234545</itemNumber>
<itemPrice>34.676</itemPrice>
</productLevel_previously_level_4>
</products>
</productGroup3>
</productGroup2>
</productGroup1>
</root>
Вопрос Объяснение: Мне нужно работать w с n уровнями (т.е. уровень n + 1 должен перейти на уровень n). Я стараюсь, чтобы еще раз объяснить ... У меня есть продукты на нескольких уровнях:
level 1 + products
level 2 + products
level 3 + products ...
level n + products.
Идея заключается в том, если я выбираю 1 уровень, все продукты от уровня больше, чем 1 (то есть 2, 3, 4 ... п) агрегируются на уровне 1:
<productGroup1 GroupID="[email protected]@SHOP1">
<GroupName>AAA</GroupName>
<GroupLevel>1</GroupLevel>
<products>
<product>
<ProductName>CCC</ProductName>
</product>
</products>
<products>
<product>
<ProductName>Mem</ProductName>
</product>
</products>
</productGroup1>
Если я выбираю 2-го уровня, уровень 1 цела и все продукты от уровня больше, чем 2 (то есть 3, 4 ... п) агрегируются на уровне 2. То же самое касается всех уровней (нет предела).
Можно ли положить CTE в хранимую процедуру?
Можете ли вы предоставить образец «объединенного» XML? – Alex