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

Откуда: ->|<- :адуктО
Сообщений: 22426
Почему в третьем случае результат отличается?

CREATE TABLE #tm (F1 nvarchar(10), F2 nvarchar(10))
INSERT #tm VALUES(N'aa', N'2')
INSERT #tm VALUES(N'bbb', N'1')

declare @Accum nvarchar(1000)

set @Accum=N''
SELECT @Accum=@Accum+N', '+F1 FROM #tm
SELECT @Accum
--результат ожидаем: ', aa, bbb'

set @Accum=N''
SELECT @Accum=@Accum+N', '+F1 FROM #tm ORDER BY F2
SELECT @Accum
--результат ожидаем: ', bbb, aa'

set @Accum=N''
SELECT @Accum=@Accum+N', '+F1 FROM #tm ORDER BY LEN(F2)
SELECT @Accum
--результат неожиданный: ', bbb'

DROP TABLE #tm
11 сен 15, 16:22    [18138905]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Фигня какая-то!

Но вот так работает корректно:

SELECT
    -- Remove First Comma
    GROUP_CONCAT = STUFF(
        (
            -- Concatinate Strings
            SELECT ',' + F1
            FROM #tm
            ORDER BY LEN(F2)
            FOR XML PATH('')
        ),
        1,1,''
    );
11 сен 15, 16:29    [18138967]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ну как бы никто не обещает гарантированного результата для этой недокументированной фичи
11 сен 15, 16:30    [18138973]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Konst_One
ну как бы никто не обещает гарантированного результата для этой недокументированной фичи

А что там недокументированного?
11 сен 15, 16:33    [18138996]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
Yuri Abele
Konst_One
ну как бы никто не обещает гарантированного результата для этой недокументированной фичи

А что там недокументированного?


SELECT @Accum=@Accum + ...

не кто не обещает, что это будет работать в будущих версиях
а с ORDER BY , тем более не гарантируется результат
11 сен 15, 16:36    [18139018]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Konst_One
Yuri Abele
пропущено...

А что там недокументированного?


SELECT @Accum=@Accum + ...

не кто не обещает, что это будет работать в будущих версиях
а с ORDER BY , тем более не гарантируется результат


Оно и сейчас не всегда работает, я не так давно имел проблему.
11 сен 15, 16:42    [18139053]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22426
Фича вроде документированная. Мне не столько интересно, как обойти, сколько интересно - почему ))
Пробовал на 2000 и на 2012 - результат одинаков.
11 сен 15, 16:43    [18139067]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Konst_One
а с ORDER BY , тем более не гарантируется результат

Натолкнуло на мысль - проверил - таки да, так работает:

SELECT @Accum=@Accum+N', '+F1 FROM (SELECT TOP 100 PERCENT F1 FROM #tm ORDER BY LEN(F2)) T;
11 сен 15, 16:44    [18139076]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Shocker.Pro
Фича вроде документированная. Мне не столько интересно, как обойти, сколько интересно - почему ))
Пробовал на 2000 и на 2012 - результат одинаков.


вам же сказали - недокументированная, поведение ее с order by нигде не описано. и ваш одиночный тест не может гарантировать, что в других условиях или даже при другом запуске результат будет таким же. используйте for xml
11 сен 15, 17:10    [18139214]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Shocker.Pro
Фича вроде документированная. Мне не столько интересно, как обойти, сколько интересно - почему ))
Недокументированная.
Почему - объясняется тут.
11 сен 15, 17:17    [18139238]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22426
Спасибо, ясно.

for xml использовать не мог, так как эта база крутится на 2000, впрочем, как я сказал, это не очень принципиальный вопрос.
11 сен 15, 17:42    [18139362]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Shocker.Pro
for xml использовать не мог, так как эта база крутится на 2000
В 2000-м можно так обойти:
set @Accum=N''
SELECT @Accum=@Accum+N', '+t.F1 FROM (SELECT TOP 100 PERCENT F1 FROM #tm ORDER BY LEN(F2)) t
SELECT @Accum
11 сен 15, 18:17    [18139542]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22426
Да я уж понял, спасибо
Только я вот почему-то был уверен, что способ документированный...
11 сен 15, 18:24    [18139578]     Ответить | Цитировать Сообщить модератору
 Re: Накопление строки в запросе  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Shocker.Pro,

SELECT top 1000 @Accum=@Accum+N', '+F1 FROM #tm ORDER BY LEN(F2)
Пробовали?
15 сен 15, 01:05    [18149194]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить