Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Конкатенация строк можно ли сделать лучше  [new]
strconcat
Guest
Коллеги,
подскажите пожалуйста есть ли какой-нибудь универсальный способ для объединения строк в MS SQL.

Есть таблица, в нескольких столбцах которых есть строковые значения:

declare @t table(is_str01 bit, is_str02 bit, str01 nvarchar(100), str02 nvarchar(100), order_by int)

insert into @t(is_str01, is_str02, str01, str02, order_by)
select 1, 1, 'Test01', 'D01', 50
union all
select 0, 1, null, 'D02', 51
union all
select 1, 0, 'Test03', 'D03', 50


Их надо объединить по строчно.

Т.е. примерно так:
select (
select 
str01 as 'data()'
from @t
order by order_by desc
for xml path('')) as str01
, (
select 
str02 as 'data()'
from @t
order by order_by desc
for xml path('')) as str02


Проблема в том, что реальный запрос содержит таких колонок гораздо больше и табличная переменная @t может быть сложным запросом.
Хочется избежать лишнего обращения к табличной переменной @t, т.е. сделать что-то вроде оконной функции sum(field) over (partition by order by ). Возможно ли это?
30 окт 15, 09:22    [18347223]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк можно ли сделать лучше  [new]
Glory
Member

Откуда:
Сообщений: 104760
strconcat
Возможно ли это?

в CLR вы можете организовать все, что вам нужно, и так, как вам нужно
30 окт 15, 09:26    [18347244]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк можно ли сделать лучше  [new]
strconcat
Guest
Про CLR я знаю, спасибо.

Все-таки хочется именно средствами T-SQL реализовать такую логику.
30 окт 15, 09:51    [18347353]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк можно ли сделать лучше  [new]
Glory
Member

Откуда:
Сообщений: 104760
strconcat
Все-таки хочется именно средствами T-SQL реализовать такую логику.

Силой мысли заставить sum работать с символьными полями что ли ?
30 окт 15, 09:52    [18347355]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк можно ли сделать лучше  [new]
strconcat
Guest
Glory,

не извращайте мой вопрос. Я знаю, что sum() не работает со строками и функции sum для строк в MS SQL нет.
Логику я реализовал без её использования, вопрос в том, можно ли эту же логику реализовать без подзапросов (с одним обращением к табличной переменной).
30 окт 15, 09:57    [18347378]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк можно ли сделать лучше  [new]
Glory
Member

Откуда:
Сообщений: 104760
strconcat
Я знаю, что sum() не работает со строками и функции sum для строк в MS SQL нет.

И что вы тогда хотите "именно средствами T-SQL реализовать" ?
30 окт 15, 09:59    [18347386]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк можно ли сделать лучше  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Средствами TSQL можно - рекурсивным CTE.
В данном конкретном случае вряд ли понравится.
30 окт 15, 10:31    [18347520]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк можно ли сделать лучше  [new]
Glory
Member

Откуда:
Сообщений: 104760
declare @t table(is_str01 bit, is_str02 bit, str01 nvarchar(100), str02 nvarchar(100), order_by int)

insert into @t(is_str01, is_str02, str01, str02, order_by)
select 1, 1, 'Test01', 'D01', 50
union all
select 0, 1, null, 'D02', 51
union all
select 1, 0, 'Test03', 'D03', 50

select * from @t

DECLARE @Result1 NVARCHAR(4000), @Result2 NVARCHAR(4000)
SET @Result1 = ''
SET @Result2 = ''
SELECT @Result1 = @Result1 + ISNULL(str01, '') + ' ', 
	@Result2 = @Result2 + ISNULL(str02, '') + ' ' 
	FROM @t
select @Result1, @Result2
30 окт 15, 10:33    [18347534]     Ответить | Цитировать Сообщить модератору
 Re: Конкатенация строк можно ли сделать лучше  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
declare @t table(is_str01 bit, is_str02 bit, str01 nvarchar(100), str02 nvarchar(100), order_by int);

insert into @t(is_str01, is_str02, str01, str02, order_by)
select 1, 1, 'Test01', 'D01', 50
union all
select 0, 1, null, 'D02', 51
union all
select 1, 0, 'Test03', 'D03', 50;

with s(x) as
(
 select
  str01, str02
 from
  @t
 order by
  order_by
 for xml path(''), type
)
select
  x.query('str01').value('.', 'varchar(max)') as str01_concatenated,
  x.query('str02').value('.', 'varchar(max)') as str02_concatenated
from
 s;
30 окт 15, 11:04    [18347692]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить