SQL Server заполняет переменную XML из строк VARCHAR

У меня есть таблица с одним столбцом в SQL Server.

Этот столбец содержит каждую строку XML-документа.

Примерная таблица:

         Column
---------------
Row1:    <ROOT>
Row2:    <Name>name1</Name>
Row3:    </ROOT>

Тип данных столбца - nvarchar(max)

Я хочу делать:

DECLARE @RES_XML XML

SET @XML = Set from table above

Как я могу суммировать все строки вышеприведенной таблицы и заполнить @RES_XML?

Примечание. при объединении; все данные в таблице превышают nvarchar(max) лимит.


person Ahmet Altun    schedule 21.04.2015    source источник
comment
<Name="name1"> не является допустимым XML.   -  person Alvin Thompson    schedule 21.04.2015
comment
Вам понадобится как минимум второй столбец, чтобы упорядочить таблицу. Если вы не укажете порядок, операторы select будут возвращать строки, упорядоченные в случайном порядке.   -  person    schedule 21.04.2015
comment
Вы превышаете лимит в 2 ГБ (2 миллиарда символов)? В САМОМ ДЕЛЕ?!?!? Это примерно 200 раз всего текста Войны и мира Льва Толстого - для начала очень толстой книги ....   -  person marc_s    schedule 21.04.2015
comment
@marc_s согласно вашему собственному ответу здесь, на самом деле это 1 миллиард символов (n varchar имеет 2 байта на символ), что составляет около 166 копий. Однако мне здесь нравится единица измерения, 166 Вт и хранилище. И мне интересно, сколько kW & P OP потребуется для их xml-документа.   -  person asontu    schedule 22.04.2015
comment
@funkwurm: черт возьми, ты прав :-) Извините - достаточно для как минимум 100 копий War & Peace - но даже это трудно превзойти! :-)   -  person marc_s    schedule 22.04.2015


Ответы (2)


В общем, самый простой способ объединить значения в переменную - это

declare @res nvarchar(max)

select @res = isnull(@res, '') + [Column]
from <table above>

select cast(@res as xml)

Конечно, порядок конкатенации в этом запросе не определен (но есть трюк, чтобы проверить, сохраняется ли порядок)

person Roman Pekar    schedule 22.04.2015

Я так же удивлен тем, что вы превысили ограничение в nvarchar(max) столбцов, как и Марк, но, возможно, у вас есть настройки ограничения столбцов в настройках вашей базы данных, которые вы не можете изменить. Вот как я бы это сделал, и я предполагаю, что есть какой-то столбец, который позволяет вам упорядочивать теги в соответствующем порядке, вы не можете полагаться на порядок, в котором база данных решила сохранить и получить ряды.

declare @t table (
    id int,
    x nvarchar(max)
)

insert into @t
select 1, '<ROOT>' union all
select 2, '<Name>name1</Name>' union all
select 3, '</ROOT>'

DECLARE @RES_XML XML

select @RES_XML = cast((
        select x
        from @t
        order by id
        for xml path(''), type
    ).value('.', 'nvarchar(max)') as xml)
person asontu    schedule 22.04.2015
comment
Разве это не столкнется с потолком nvarchar (max) при приведении в .value ()? OP говорит при объединении; все данные в таблице превышают предел nvarchar (max) - person Nathan Skerl; 22.04.2015
comment
@NathanSkerl Я предполагаю, что ограничения столбца OP более ограничены, чем у переменной nvarchar(max). Если это действительно ограничение в 2 ГБ, то я не знаю, как им помочь, ответ Романа Пекара столкнется с той же проблемой, потому что его @res также nvarchar(max) - person asontu; 23.04.2015