Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Соединение строк в одну  [new]
Gizmor
Member

Откуда:
Сообщений: 54
Доброго времени суток,
есть такая необходимость
из запроса

declare @tab table (N NVARCHAR(10))

insert into @tab (N)
values('A')
insert into @tab (N)
values('B')
insert into @tab (N)
values('B')

select * from @tab

получить значение "А/В", то есть убрать повторяющиеся значения и перечислить все значения строк в одной через дробь.
Спасибо.
17 май 12, 14:13    [12569995]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
Gizmor
Member

Откуда:
Сообщений: 54
Повторяющиеся строки можно оператором DISTINCT убить, дальше непонятно
17 май 12, 14:18    [12570077]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Дальше - читать FAQ.
17 май 12, 14:19    [12570090]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
declare @res_string varchar(max)
declare @st varchar(max)
set @res_string = ''
declare c cursor local static forward_only for select distinct isnull(val,'') from tTest3
open c
fetch next from c into @st
while @@fetch_status=0
begin
set @res_string = @res_string + '\' + @st
fetch next from c into @st
end
close c
deallocate c

select @res_string


И никогда больше не используйте курсоры.
17 май 12, 14:44    [12570358]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Gizmor

А лучше, и в этом случае не используйте.
17 май 12, 14:46    [12570386]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
Forx
Member

Откуда:
Сообщений: 52
declare @tab table (N NVARCHAR(10))

insert into @tab (N)
values('A')
insert into @tab (N)
values('B')
insert into @tab (N)
values('B')

select STUFF((select distinct '/'+ n from @tab for xml path('')),1,1,'')
17 май 12, 14:54    [12570478]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
is_me,все же Вам доставляет удовольствие постить говнокод.
Добавлю в коллекцию как НЕ надо делать
+

declare @str varchar(max)='';
select @str = @str + field + ','
from table;

17 май 12, 14:55    [12570492]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
SomewhereSomehow
Gizmor

А лучше, и в этом случае не используйте.


В этом случае можно, т.к ограничение на колисество строк
таблицы заведомо установлено типом varchar(8000), т.к
по вопросу ТС именно в строку надо вывести результат.

А вообще, действительно, ну эти курсоры.
17 май 12, 14:58    [12570531]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
Gizmor
Member

Откуда:
Сообщений: 54
Спасибо, Forx, то что надо
17 май 12, 15:09    [12570670]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Forx, не совсем универсальное решение
declare @tab table(n varchar(10))
insert into @tab (N)
values('A<>@"')
insert into @tab (N)
values('B&')
insert into @tab (N)
values('B')

select STUFF((select distinct '/'+ n from @tab for xml path('')),1,1,'')

так надежнее
;with zz(x)
as
(
select distinct  n + '/' from @tab for xml path(''),type
)
select x.value('.','nvarchar(max)') from zz
17 май 12, 15:17    [12570790]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
denis2710
Forx, не совсем универсальное решение
declare @tab table(n varchar(10))
insert into @tab (N)
values('A<>@"')
insert into @tab (N)
values('B&')
insert into @tab (N)
values('B')

select STUFF((select distinct '/'+ n from @tab for xml path('')),1,1,'')

так надежнее
;with zz(x)
as
(
select distinct  n + '/' from @tab for xml path(''),type
)
select x.value('.','nvarchar(max)') from zz


Надежнее всего как я напостил, но кодговно и работает медленнее
17 май 12, 15:21    [12570840]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
is_me
Надежнее всего как я напостил
И сможете это доказать?
17 май 12, 15:28    [12570927]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
invm
is_me
Надежнее всего как я напостил
И сможете это доказать?

Василий Иванович: "Петька, а сколько будет 0.5 + 0.5?"
Петька: "Нутром чую - литра, а доказать не могу" :-)
17 май 12, 15:30    [12570946]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
is_me,
автор
Василий Иванович: "Петька, а сколько будет 0.5 + 0.5?"
Петька: "Нутром чую - литра, а доказать не могу" :-)

Даже анекдоты у вас какие-то неказистые
Василий Иванович: "Петька, а сколько будет 1/2 + 0.5?"
Петька: "Нутром чую - литр, а доказать не могу"
17 май 12, 15:44    [12571080]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
denis2710
Василий Иванович: "Петька, а сколько будет 1/2 + 0.5?"
Петька: "Нутром чую - литр, а доказать не могу"
Не сиквелист Петька, однако:
select 1/2 + 0.5
(No column name)
0.5
17 май 12, 16:07    [12571285]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
denis2710
is_me,
автор
Василий Иванович: "Петька, а сколько будет 0.5 + 0.5?"
Петька: "Нутром чую - литра, а доказать не могу" :-)

Даже анекдоты у вас какие-то неказистые
Василий Иванович: "Петька, а сколько будет 1/2 + 0.5?"
Петька: "Нутром чую - литр, а доказать не могу"

Даже здесь разница только в синтаксисе.
17 май 12, 16:07    [12571294]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
alexeyvg
denis2710
Василий Иванович: "Петька, а сколько будет 1/2 + 0.5?"
Петька: "Нутром чую - литр, а доказать не могу"
Не сиквелист Петька, однако:
select 1/2 + 0.5
(No column name)
0.5

сиквел в интегер преобразует 1/2, а не в литры.
А в литрах без округлений, там каждая сотая важна.
17 май 12, 16:15    [12571372]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
ну тоды уж лучше так
declare @tab table (N NVARCHAR(10))

insert into @tab (N)
values('A')
insert into @tab (N)
values('B')
insert into @tab (N)
values('B')
insert into @tab (N)
values('C')
insert into @tab (N)
values('D')

declare @str varchar(max) = '';
select @str = @str + '/'  + n 
from ( select distinct n from @tab ) t

select stuff(@str, 1, 1, '')
17 май 12, 16:27    [12571484]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> ну тоды уж лучше так

только вот на счет этого вы в курсе, надеюсь?
http://support.microsoft.com/kb/287515/en-us

Posted via ActualForum NNTP Server 1.5

17 май 12, 16:36    [12571571]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Странно, что до сих пор нет ни одного примера с CLR или extended stored proc. Как жеж так...
17 май 12, 16:38    [12571588]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
тыц
Вообще складывается впечатления,что некоторых пользователей забанили все поисковые системы.
17 май 12, 16:48    [12571706]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
Сергей Мишин
Member

Откуда:
Сообщений: 376
kDnZP
Странно, что до сих пор нет ни одного примера с CLR или extended stored proc. Как жеж так...

http://msdn.microsoft.com/en-us/library/ms131056(v=SQL.100).aspx
ну вот для полноты картины и по просьбам трудящихся-)

To Gizmor,
это НЕ для вашего случая.
17 май 12, 17:32    [12572117]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
cocos
Guest
daw
> ну тоды уж лучше так

только вот на счет этого вы в курсе, надеюсь?
http://support.microsoft.com/kb/287515/en-us


daw, если можно, 2 вопроса:
1. там в статье про ORDER BY, или я чего-то недопонимаю? и вроде в коде постом выше нет ни ORDER BY, ни EXPRESSIONS в нем.
2. у меня как раз была ситуация, описанная в статье, в смысле, результат обрезанный был (правда, на 2008 сервере не воспроизводится, но на 2005 все именно как я написала:
link), ORDER BY есть, но в нем нет EXPRESSIONS.
мне в форуме ответили тогда, что это не из-за , а из-за недокументированности.
я же с одной стороны вижу, что обрезает именно если есть ORDER BY, но с другой стороны, ведь у меня нет EXPRESSIONS!
Вы как могли бы это прокомментировать?
17 май 12, 18:19    [12572587]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
cocos
Guest
кстати да, как и написано в статье, план различный, когда получаю нормальный или обрезанный результат
(как только меняю длину строки)
хотя никаких выражений в ORDER BY нет.
так что вывод: с выражениями или без, но ORDER BY при сборе в переменную это залог непредсказуемого результата

К сообщению приложен файл. Размер - 36Kb
17 май 12, 18:36    [12572714]     Ответить | Цитировать Сообщить модератору
 Re: Соединение строк в одну  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
daw
> ну тоды уж лучше так

только вот на счет этого вы в курсе, надеюсь?
http://support.microsoft.com/kb/287515/en-us


нет не в курсе, спасибо
17 май 12, 18:37    [12572721]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить