Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 проблема объединения строк с помощью ...for xml path('')  [new]
tomcat2
Member

Откуда:
Сообщений: 69
т.к. это XML то все служебные символы типа '<man>' заменяются на соотв. комбинации типа '& l t ; man & g t ;' (все пробелы убрать) что неприемлемо.
не вижу пока другого способа кроме курсоров или старого доброго 'select @str=@str+','+colname... '
23 окт 16, 11:17    [19813157]     Ответить | Цитировать Сообщить модератору
 Re: проблема объединения строк с помощью ...for xml path('')  [new]
tomcat2
Member

Откуда:
Сообщений: 69
сам спросил сам ответ нашел. тему можно закрывать.
23 окт 16, 11:37    [19813178]     Ответить | Цитировать Сообщить модератору
 Re: проблема объединения строк с помощью ...for xml path('')  [new]
aleks2
Guest
Бред. Все можно

Экранированные символы заменить на их нормальный вид дешево и сердито
23 окт 16, 13:03    [19813271]     Ответить | Цитировать Сообщить модератору
 Re: проблема объединения строк с помощью ...for xml path('')  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
(SELECT ... FOR XML PATH(''), TYPE).value('.','nvarchar(max)')
Только вот, говорят, value() катастрофически снижает производительность...
23 окт 16, 16:44    [19813429]     Ответить | Цитировать Сообщить модератору
 Re: проблема объединения строк с помощью ...for xml path('')  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
iap
Только вот, говорят, value() катастрофически снижает производительность...
+ Проверим это "говорят"
use tempdb;
go

create table dbo.t (id int identity primary key, s nvarchar(4000));
go

declare @s nvarchar(4000) = replicate(N'&lt;p style=&quot;margin-left:-7.1pt;&quot;&gt;&lt;strong&gt;Полулюкс&lt;/strong&gt; ...&lt;/p&gt;', 50);

insert into dbo.t
select top (10000)
 @s
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go

declare @s1 nvarchar(4000), @s2 nvarchar(max);
 
set statistics time on;

print 'replace';
select
 @s1 = replace(replace(replace(replace(replace(s, N'&lt;', N'<'), N'&gt;', N'>'), N'&amp;', N'&'), N'&quot;', N'"'), N'&apos;', N'''')
from
 dbo.t
option
 (maxdop 1);

print 'xml.value -> nvarchar(4000)';
select
 @s1 = cast('<a>' + s + '</a>' as xml).value('a[1]', 'nvarchar(4000)')
from
 dbo.t
option
 (maxdop 1);

print 'xml.value -> nvarchar(max)';
select
 @s2 = cast('<a>' + s + '</a>' as xml).value('a[1]', 'nvarchar(max)')
from
 dbo.t
option
 (maxdop 1);

set statistics time off;
go

drop table dbo.t;
go

replace
Время работы SQL Server:
Время ЦП = 17051 мс, затраченное время = 17091 мс.

xml.value -> nvarchar(4000)
Время работы SQL Server:
Время ЦП = 46 мс, затраченное время = 35 мс.

xml.value -> nvarchar(max)
Время работы SQL Server:
Время ЦП = 156 мс, затраченное время = 154 мс.

+ для этих же данных производительность простой CLR-обертки над Regex.Replace
Regex.Replace -> nvarchar(4000)
Время работы SQL Server:
Время ЦП = 4384 мс, затраченное время = 4428 мс.
23 окт 16, 22:28    [19813767]     Ответить | Цитировать Сообщить модератору
 Re: проблема объединения строк с помощью ...for xml path('')  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
tomcat2, попробуй такой вариант:
SELECT [name], STUFF((
    SELECT ', ' + c.[name]
    FROM sys.columns c
    WHERE c.[object_id] = t.[object_id]
    FOR XML PATH(''), TYPE).value('(./text())[1]', 'NVARCHAR(MAX)'), 1, 2, '')
FROM sys.objects t
WHERE t.[type] = 'U'
24 окт 16, 14:26    [19815836]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить