2015-07-09 2 views
1

Я пытаюсь сгенерировать некоторый XML с использованием TSQL и с некоторыми проблемами, я смог добраться до уровня 2 уровня, но застрял на 3. Как он должен работать в примере, который я опубликовал, Заказы на поставку, первый заказ на поставку имеет только одну часть с одной версией для этой части. Второй заказ на поставку состоит из 2 частей каждой части с собственным выпуском. В конце я должен иметь 2 XML-документа, которые пересекают 3 уровня, выпуск/часть/заказ на поставку. Я думаю, что меня путают при подключении к следующему этапу, а также к группе. Пример показывает только 2 части, но может быть много частей к одному заказу на поставку, но только один выпуск на часть, любая помощь будет высоко оценена ,Использование TSQL для генерации XML

DECLARE @sdv AS TABLE  
(
PID INT IDENTITY(1,1) PRIMARY KEY, 
PurchaseOrder varchar(20), 
PartNo int, 
Release int 
) 


INSERT INTO @sdv values ('PURC123', 111, 1) 
INSERT INTO @sdv values ('PURC333', 222, 1) 
INSERT INTO @sdv values ('PURC333', 333, 1) 


select 
    PurchaseOrder, 
(
select 
    PartNo, 
(
select 
    Release 
from 
@sdv a3 
where 
a3.Release = a2.Release and 
a3.PartNo = a2.PartNo and 
a3.PurchaseOrder = a1.PurchaseOrder 
for xml path('Release'), type 
) 
from 
@sdv a2 
where 
a2.PartNo = a1.PartNo 
group by a2.PartNo 
for xml path('part'), type 
) from @sdv a1 
group by PurchaseOrder 
for xml path('Purchase') 
+1

Вы можете написать XML, который вы хотите получить от текущих данных набора, так что я могу понять это лучше? – msmolcic

+0

Не могли бы вы включить образец вывода в формате XML. У меня есть несколько рабочих параметров, но я хочу убедиться, что у меня есть правильный выбор для ваших нужд. –

ответ

2

Я собираюсь застрелить вас, чтобы вы могли поиграть с ним. Сегодня я собираюсь немного дольше, но завтра вернусь.

Для этого примера я просто использовал атрибуты, так как я могу прочитать его немного проще. Я сделал свою группировку с использованием CTE и предположил, что отношение между 1 и несколькими элементами составляет 1. (может быть неправильно, но вам нужна информация). Было также немного туманно о уровнях, требующих пройти третью глубину. Если мы говорим об итерациях частей (версий), тогда вы можете просто добавить @Release на второй уровень. Примечание. Если вам не нужны атрибуты, просто удалите @ перед каждым тегом.

Я бы очень рекомендовал быть очень добросовестным в отношении вашего кода, когда делаете иерархическую работу xml. Его легко потерять.

КОД

DECLARE @sdv AS TABLE  
(
PID INT IDENTITY(1,1) PRIMARY KEY, 
PurchaseOrder varchar(20), 
PartNo int, 
Release int 
) 


INSERT INTO @sdv values ('PURC123', 111, 1) 
INSERT INTO @sdv values ('PURC333', 222, 1) 
INSERT INTO @sdv values ('PURC333', 333, 1) 

;WITH PO AS (
    SELECT DISTINCT PurchaseOrder 
    FROM @sdv 
) 
SELECT L1.PurchaseOrder AS "@PurchseOrder", 
     ( SELECT PartNo AS "@PartNo", 
        ( SELECT DISTINCT L3.Release AS "@Release" 
         FROM @sdv AS L3 
         WHERE L2.PartNo = L3.PartNo 
         ORDER BY L3.Release ASC 
         FOR  XML PATH('RELEASE'),TYPE 
        ) 
      FROM @sdv AS L2 
      WHERE L2.PurchaseOrder = L1.PurchaseOrder 
      FOR XML PATH('PART'), TYPE 
     )  
FROM PO AS L1 
FOR  XML PATH('PurchaseOrder'), ROOT('PurchaseOrders') 

XML OUTPUT

<PurchaseOrders> 
    <PurchaseOrder PurchseOrder="PURC123"> 
    <PART PartNo="111"> 
     <RELEASE Release="1" /> 
    </PART> 
    </PurchaseOrder> 
    <PurchaseOrder PurchseOrder="PURC333"> 
    <PART PartNo="222"> 
     <RELEASE Release="1" /> 
    </PART> 
    <PART PartNo="333"> 
     <RELEASE Release="1" /> 
    </PART> 
    </PurchaseOrder> 
</PurchaseOrders> 
+0

Привет, Мэтт, спасибо за быстрый ответ, это почти то, что я хотел, мои извинения для себя и других людей, которые ответили, что я должен опубликовать некоторый пример XML. Хотя это тот формат, который я хотел, я хотел бы разбить каждый заказ на заказ отдельно, поскольку мне нужно создать отдельные файлы для каждого заказа на поставку для ftp в другую компанию. Я попытался добавить в группу, но все еще не получил желаемого результата, могу ли я попросить вас о дальнейшей помощи, пожалуйста! – PJD

+0

Извините, я пропустил ответ на ваш вопрос, если я правильно понял ваш вопрос, будет только 1 выпуск на часть, но многие части в один заказ на покупку, надеюсь, что это поможет. – PJD

+0

Привет, Matt, После некоторых дополнительных поправок к вашему оригинальному сценарию я почти там, теперь у меня есть заказ на поставку, столбец, в котором перечислены покупки, а затем столбец с XML, но, к сожалению, он вернулся к тому, чтобы выглядеть, когда вы используете AUTO вместо PATH, поэтому формат не совсем такой, какой он есть, можете ли вы помочь – PJD

Смежные вопросы