2010-05-18 7 views
0

Можно ли сразу выбрать несколько таблиц? Например, я могу сделать:SQL Server «для xml», несколько таблиц, несколько узлов

SELECT (
    SELECT * FROM Articles 
    FOR XML PATH('article'), TYPE 
) 
FOR XML PATH('articles'), ROOT('data') 

и

SELECT (
    SELECT * FROM ArticleTypes 
    FOR XML PATH('articleType'), TYPE 
) 
FOR XML PATH('articleTypes'), ROOT('data') 

Могу ли я присоединиться и так, что я получаю следующий вывод? Я не могу использовать UNION, потому что структуры таблицы не совпадают.

<data> 
    <articles> 
    <article>...</article> 
    ... 
    </articles> 
    <articleTypes> 
    <articleType>...</articleType> 
    ... 
    </articleTypes> 
</data> 

ответ

2

Каждый столбец в объединении имеет только одно имя столбца, а это имя столбца берется из первого запроса. Вы можете обойти это, установив столбцы из другой таблицы в null, вместо того, чтобы опускать их.

select * 
from (
    select 
     1 as 'Articles/Id' 
    , 'Name' as 'Articles/Name' 
    , null as 'ArticleType/Id' 
    , null as 'ArticleType/Type' 
) Articles 
union all 
select * 
from (
    select 
     null as 'Articles/Id' 
    , null as 'Articles/Name' 
    , 1 as 'ArticleType/Id' 
    , 'Type' as 'ArticleType/Type' 
) ArticleType 
FOR XML PATH(''), ROOT('data') 

Это приводит к:

<data> 
    <Articles> 
     <Id>1</Id> 
     <Name>Name</Name> 
    </Articles> 
    <ArticleType> 
     <Id>1</Id> 
     <Type>Type</Type> 
    </ArticleType> 
</data> 
+0

Ваш результат не соответствует моему примеру вывода (но я, вероятно, мог бы изменить его). Кроме того, я хотел бы избежать указания всех столбцов, потому что их много. Это в основном свалка из нескольких таблиц. Я мог бы объединить его на стороне приложения, если мне действительно нужно, но я надеюсь, что SQL это сможет сделать. –

+0

@Nelson: Вы можете снова обернуть статьи, например 'Article/Articles/Id'. Как и в ответе, профсоюз требует, чтобы все столбцы во всех частях союза. Я не знаю, как это сделать. – Andomar

+0

@Andomar: Последнее, что я хотел бы прояснить. Я понимаю, как работает профсоюз, и что он требует всех столбцов. Можно ли делать то, что я хочу * без * союза? –

0

В зависимости от версии SQL Server, который вы используете. Как насчет чего-то вроде этого переполнения стека post?

0

Можно НЕ перечислить все столбцы в таблицах, НЕ должен использовать UNION и не должно иметь повторяющиеся столбцы, используя следующий метод:

  1. захватить данные, необходимые в временные таблицы (в моем случае это было с другого сервера, используя OPENQUERY так что это было проще, но может быть пропущен, если строки являются локальными)
  2. Cursor через основную таблицу управления и для каждого первичного ключа строки:
    • генерировать ваш мульти- level XML Path Output и поместите его в переменную xml
    • вставить переменную XML в выходном tempXMLOutput таблицу со столбцом типа XML
  3. После того, как вы выбрали все данные на выходе курсора вашего tempXMLOutput таблица

Это будет отображать все данные без фанка повторяющиеся столбцы, и это не займет много времени для кодирования.

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