Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 nvarchar + order by -- откуда такое поведение и как обойти?  [new]
cocos
Guest
нужно собрать столбец в строку в определенном порядке.
сервер 2005, но с
for xml path
вышел облом, т.к. в столбце полно значений с
<,>
(можно ли как-то это обойти? а то непотребщиной заменяется в результате)
итак, пробую собирать в переменную:
declare @a nvarchar(max);
set @a = '';

with cte as
(select 0 as n, cast ('qqq' as nvarchar(1044)) s
 union all 
 select 3, 'aaa'
 union all 
 select 4, 'bbb'
)

select @a = @a + s + ', '
from cte	
--order by n

select @a

---------------
qqq, aaa, bbb, 

и вот пока не упорядочиваю -- собирает.
как только добавляю order by n -- выводит всегда только одно значение из всего столбца:

declare @a nvarchar(max);
set @a = '';

with cte as
(select 0 as n, cast ('qqq' as nvarchar(1044)) s
 union all 
 select 3, 'aaa'
 union all 
 select 4, 'bbb'
)

select @a = @a + s + ', '
from cte	
order by n

select @a

--------------
bbb, 

поле изначально
 nvarchar(max)
.
если его преобразовать к чему-то поменьше типа
nvarchar(1043)
-- работает и с order by.
как только превышаю какое-то(в данном случае 1043) значение (зависит от числа строк почему-то,
чем больше строк, тем меньше надо указать размер, чтоб собирал с order by) -- снова не собирает.
подскажите, знающие люди, какое этому объяснение и как его обойти
29 ноя 11, 22:49    [11680583]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Объяснение состоит в том, что Вы используете недокументированную возможность. Может сработать, а может нет.

Сообщение было отредактировано: 29 ноя 11, 22:55
29 ноя 11, 22:55    [11680601]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
cocos
Guest
pkarklin,
так вроде это было описано где-то тут же на форуме в ФАКе, для версии 2000.
почему-то сейчас не нахожу, но явно идея отсюда.
а что именно не документировано, + order by или вообще вся сборка из селекта в переменную?
29 ноя 11, 23:02    [11680621]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
cocos,

Недокументирована вся сборка в переменную.
29 ноя 11, 23:09    [11680633]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
cocos
Guest
ужас-то какой. даже в видео курсе AppDev есть этакая сборка для динамического пивота.
кто бы мог подумать, что недокументировано.
а как бы обойти замену <> в xml на непотребщину?
можно конечно устроить сперва Replace(s, '<', 'xxxxxxxxxx'),
а после сборки в строку -- обратно Replace(s, 'xxxxxxxxxx', '<').
но как-то уж криво...
29 ноя 11, 23:17    [11680652]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
step_ks
Member

Откуда:
Сообщений: 936
cocos
а как бы обойти замену <> в xml на непотребщину?

https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=769237&msg=8987372
30 ноя 11, 00:09    [11680771]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
cocos
Guest
спасибо, помогло:
with cte as
(select 0 as n, cast ('qqq' as nvarchar(max)) s
 union all 
 select 3, cast ('aaa' as nvarchar(max))
 union all 
 select 4, cast ('bbb' as nvarchar(max))
)

select STUFF((SELECT N', '+s FROM cte ORDER BY n FOR XML PATH(''), TYPE).value(N'.',N'NVARCHAR(MAX)'),1,2,N'') s

s
-----------------
qqq, aaa, bbb


а, простите, в свете предыдущего плачевного опыта, это -- документировано?
'TYPE).value(N'.',N'NVARCHAR(MAX)'),1,2,N'')' в первый раз вижу , где бы про это почитать?
30 ноя 11, 01:00    [11680916]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
cocos
Guest
ну вот и ФАК нашелся, и вот что в комменте написано, то у меня и вышло
последнее значение отдает и все тут

12 февраля 2007, 10:55 Viktorianka
SELECT @local_variable is usually used to return a single value into the variable. It can return multiple values if, for example, expression is the name of a column. If the SELECT statement returns more than one value, the variable is assigned the last value returned.

Это по то что написано в документации про такой селект.
30 ноя 11, 01:23    [11680960]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
cocos
а, простите, в свете предыдущего плачевного опыта, это -- документировано?
'TYPE).value('.','NVARCHAR(MAX)'),1,2,'')' в первый раз вижу , где бы про это почитать?
Это единственный вариант получения данных из XML, кто виноват что ложь вы за истину принимали. (и про какую-то несуразицу с заменой символов)

PS: А сборку в переменную, нужно вообще запретить. Но M$ же лидер по обратной совместимости багов.
30 ноя 11, 02:08    [11681014]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
step_ks
Member

Откуда:
Сообщений: 936
cocos
спасибо, помогло

Вот только будут проблемы при наличии непечатных символов типа переводов строк.
30 ноя 11, 08:25    [11681253]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
step_ks
Вот только будут проблемы при наличии непечатных символов типа переводов строк.
Что за бред?
30 ноя 11, 11:32    [11682026]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
step_ks
Member

Откуда:
Сообщений: 936
Mnior
step_ks
Вот только будут проблемы при наличии непечатных символов типа переводов строк.
Что за бред?
Не совсем уж. Насчет перевода строк - действительно, неправ. Не все символы от 0 до 31 вызывают ошибку 6841.
30 ноя 11, 12:10    [11682310]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
step_ks
Насчет перевода строк - действительно, неправ. Не все символы от 0 до 31 вызывают ошибку 6841.
Э-э-э, как вы думаете кто-тось в мире на такое нарывался? Перефразирую: Кто-то нарывался и при этом это была не ошибка проггера, а необходимость?
Например, наличие таких данных в любом месте (естественно не binary) это где-то что-то не учли. И можно даже "багом" строковых полей назвать.
Банально даже неразрывные пробелы (замест обычных) уже лажа.
30 ноя 11, 12:27    [11682461]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
step_ks
Member

Откуда:
Сообщений: 936
Mnior
Э-э-э, как вы думаете кто-тось в мире на такое нарывался? Перефразирую: Кто-то нарывался и при этом это была не ошибка проггера, а необходимость?
Например, наличие таких данных в любом месте (естественно не binary) это где-то что-то не учли. И можно даже "багом" строковых полей назвать.
Банально даже неразрывные пробелы (замест обычных) уже лажа.

Недавно как раз и нарвался. В поле номера юзеры умудрились 0x0С записать. Принимали документ из файла, выгруженного из другой программы. Что было, то принялось. На файле стоит ЭЦП, согласованного перечня разрешенных или запрещенных символов для этого поля нет, не принять или искажать, выбросив этот символ, не имею права. Ошибок формально нет, необходимости, конечно, тоже нет, но обработать надо.
30 ноя 11, 12:47    [11682657]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
Andret
Member

Откуда: Киев
Сообщений: 84
cocos,
автор
так вроде это было описано где-то тут же на форуме в ФАКе, для версии 2000.
почему-то сейчас не нахожу, но явно идея отсюда.


Да, описана. Но, кажется это было для оператора UPDATE.
30 ноя 11, 13:38    [11683098]     Ответить | Цитировать Сообщить модератору
 Re: nvarchar + order by -- откуда такое поведение и как обойти?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
step_ks
Недавно как раз и нарвался. В поле номера юзеры умудрились ...
Ошибок формально нет, необходимости, конечно, тоже нет, но обработать надо.
Да! Это вообще нормальное состяония для нашего всеми быдло-кода (только массовые репрессии ... )

Т.е. обратная поддержка багов, именно багов и старых версий, это неотъемлемая часть реальности. И тут стоит делема, отказываться от новых технологий или от поддержки багов. Компромис неизбежен.
И какова позиция?

У меня лично такая: Лучше внедрение чистого нового, а совместимость пусть решает разраб всеми способами. И административными также! В первую очередь!

Повторюсь, это проблема реальности всего мира, а не мира программеров. Поэтому это "протекает", должно, всегда, за уровни ответственности и субординации.

Такие решения я пропихиваю и наверх и по горизонтали. Ну конечно прописываение исключений, после залатывание дыр и разделения интрфейсов.

Кстати, лень административных решений это тоже бич нашей совковой соффременности.
30 ноя 11, 14:05    [11683426]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить