СЕРВЕР SQL ДЛЯ СИНТАКСА XML - PullRequest
       5

СЕРВЕР SQL ДЛЯ СИНТАКСА XML

2 голосов
/ 29 апреля 2010

Как получить вывод следующим образом, используя запрос FOR XML / sql. Я не уверен, как я могу получить значения столбцов в качестве элементов вместо имен столбцов таблиц. Я использую SQL Server 2005

У меня есть настольная маска, как следует

    CREATE TABLE PARENT
(
PID INT,
PNAME VARCHAR(20)
)

CREATE TABLE CHILD
(
PID INT,
CID INT,
CNAME VARCHAR(20)
)

CREATE TABLE CHILDVALUE
(
CID INT,
CVALUE VARCHAR(20)
)

INSERT INTO PARENT VALUES (1, 'SALES1')
INSERT INTO PARENT VALUES (2, 'SALES2')

INSERT INTO CHILD VALUES (1, 1, 'FOR01')
INSERT INTO CHILD VALUES (1, 2, 'FOR02')
INSERT INTO CHILD VALUES (2, 3, 'FOR03')
INSERT INTO CHILD VALUES (2, 4, 'FOR04')

INSERT INTO CHILDVALUE VALUES (1, '250000')
INSERT INTO CHILDVALUE VALUES (2, '400000')
INSERT INTO CHILDVALUE VALUES (3, '500000')
INSERT INTO CHILDVALUE VALUES (4, '800000')

Результат, который я ищу, выглядит следующим образом

<SALE1>
<FOR01>250000</FOR01>
<FOR02>400000</FOR02>
</SALE1>
<SALE2>
<FOR03>500000</FOR03>
<FOR04>800000</FOR04>
</SALE2>

Ответы [ 3 ]

1 голос
/ 03 августа 2010

Не могу понять, почему каждому узлу нужен отдельный тег - запрашивать его будет не очень весело - но в любом случае вы можете сделать это явно (без FOR XML).

Выполните цикл WHILE над своим набором записей, увеличив значение MIN (PID), и просто SELECT '<' + PNAME + '>' и так далее. Будет сложно отформатировать его так, чтобы он читался человеком, как файлы XML по умолчанию, но он все равно будет читаться любой веб-страницей и т. Д., Которые вы пытаетесь запросить.

0 голосов
/ 03 августа 2010

Узлы соответствуют именам полей. Поэтому, если вы хотите, чтобы все ваши основные узлы имели разные имена (т. Е. "<SALE1>", "<SALE2>" и т. Д.), То они не могут приходить из одного столбца.

Формат вывода, который вы запрашивали, будет трудно запрашивать значения позже. (например, это не даст вам сказать XPATH или что вам нужно «искать» в определенном «поле» для значений)

То, что вы должны искать, это:

<SALE>
   <ID>1</ID>
   <FOR>
      <ID>1</ID>
      <NUM>250000</NUM>
   </FOR>
   <FOR>
      <ID>2</ID>
      <NUM>400000</NUM>
   </FOR>
</SALE>
<SALE>
   <ID>2</ID>
   <FOR>
      <ID>3</ID>
      <NUM>500000</NUM>
   </FOR>
   <FOR>
      <ID>4</ID>
      <NUM>800000</NUM>
   </FOR>
</SALE>

Или, альтернативно, некоторая комбинация атрибутов и элементов, подобная этой:

<SALE ID="1">
       <FOR ID="1">
          <NUM>250000</NUM>
       </FOR>
       <FOR ID="2">
          <NUM>400000</NUM>
       </FOR>
    </SALE>
    <SALE ID="2">
       <FOR ID="3">
          <NUM>500000</NUM>
       </FOR>
       <FOR ID="4">
          <NUM>800000</NUM>
       </FOR>
    </SALE>

В любом случае, посмотрите книги в Интернете для SQL-Server. Вот несколько идей: FOR XML auto, elements, root ("root") FOR XML raw и т.д ...

0 голосов
/ 29 апреля 2010

Используя этот запрос здесь:

SELECT
    p.PName '@Name',
    (SELECT 
        c.CName AS '@Name',
        (SELECT 
            cv.CValue AS 'Value'
         FROM dbo.CHILDVALUE cv
         WHERE cv.CID = c.CID
         FOR XML PATH(''), TYPE
        )
     FROM dbo.CHILD c 
     WHERE c.PID = p.PID
     FOR XML PATH('Child'), TYPE
    ) 
FROM    
    Parent p
FOR 
    XML PATH('Node'), ROOT('Root')

вы можете получить результат примерно так:

<Root>
  <Node Name="SALES1">
    <Child Name="FOR01">
      <Value>250000</Value>
    </Child>
    <Child Name="FOR02">
      <Value>400000</Value>
    </Child>
  </Node>
  <Node Name="SALES2">
    <Child Name="FOR03">
      <Value>500000</Value>
    </Child>
    <Child Name="FOR04">
      <Value>800000</Value>
    </Child>
  </Node>
</Root>

, что, вероятно, примерно так же близко к вашим требованиям, как вы можете получить с помощью FOR XML PATH(), ROOT() и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...