Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как это работает?  [new]
Warlom
Member

Откуда:
Сообщений: 33
Здравствуйте, коллеги!
неожиданно наткнулся на эффект которого не ожидал:

код
declare @str varchar(max)
set @str = ''
select @str = @str + cast(t.id as varchar) from Table t
select @str


возвращает все значения id в одну строку, я уж было обрадовался, ведь можно вставить разделитель и будет счастье в соответствии с пророчеством, но тут же выяснилось что если написать:
declare @str varchar(max)
set @str = ''
select @str = @str + cast(t.id as varchar) from Table t order by id
select @str


то вернёт последнее значение из упорядоченной выборки.

Так вот собственно вопрос, что там внутри SQL происходит что даёт такой странный эффект. и стоит ли этим пользоваться если нет нужды заморачиваться на упорядочивание.

Спасибо!
27 ноя 13, 11:53    [15197252]     Ответить | Цитировать Сообщить модератору
 Re: Как это работает?  [new]
daw
Member

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

велкам ту зе клаб!
http://support.microsoft.com/kb/287515/en
27 ноя 13, 11:55    [15197267]     Ответить | Цитировать Сообщить модератору
 Re: Как это работает?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Warlom,

напиши так

declare @str varchar(max)
set @str = ''
select top (100) percent @str = @str + cast(t.id as varchar)+', '
from tpd_main t
where
		ID < 500
order by id

print @str

---если доподленно известно что значений не много - то можно просто
select top 100500


Из практики:
кстати, порядок конкатенации т.к. в каком порядке в @STR будут перечислены значения t.ID - соблюдается только если указывать
top N и order by.
27 ноя 13, 12:19    [15197510]     Ответить | Цитировать Сообщить модератору
 Re: Как это работает?  [new]
Warlom
Member

Откуда:
Сообщений: 33
путём проб и ошибок выяснил что если конкатинировать строки... т.е. не использовать cast или convert то всё работает... с топ 100500 тоже работает - спасибо!
Но вопрос всё таки стоит ли это использовать. Я всю жизнь пользовался for xml path а тут такое...
27 ноя 13, 12:32    [15197615]     Ответить | Цитировать Сообщить модератору
 Re: Как это работает?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Warlom
путём проб и ошибок выяснил что если конкатинировать строки... т.е. не использовать cast или convert то всё работает... с топ 100500 тоже работает - спасибо!
Но вопрос всё таки стоит ли это использовать. Я всю жизнь пользовался for xml path а тут такое...


Я недавно тему создавал... но зачем пробы и ошибки? вам же дали ссылку выше.
27 ноя 13, 12:40    [15197683]     Ответить | Цитировать Сообщить модератору
 Re: Как это работает?  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
Warlom
Но вопрос всё таки стоит ли это использовать.
А вы спросите себя - "Стоит ли пользоваться недокументированными возможностями?"
27 ноя 13, 12:43    [15197699]     Ответить | Цитировать Сообщить модератору
 Re: Как это работает?  [new]
Warlom
Member

Откуда:
Сообщений: 33
Winnipuh
Я недавно тему создавал... но зачем пробы и ошибки? вам же дали ссылку выше.


Я не очень представлял как искать подобную тему, поэтому поле 10 минут тщетного поиска пришлось создать свою.
Ссылку я изучил, но тем не менее самому то интересно поковыряться... мне кажется это нормально.

invm, Вы конечно правы... наверное не стоит.. тем более что есть альтернатива.
27 ноя 13, 12:55    [15197827]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить