powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
12 сообщений из 12, страница 1 из 1
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411453
topic starter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Ну вот хотим мы посмотреть список полей в таблицах, сортируя (по желанию) или по названию таблицы, или по названию поля. Тут все окей, видим длинный список:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @sort_order bit = 0;
select o.name + '.' + c.name
	from sys.columns as c
	join sys.objects as o on o.object_id = c.object_id
	order by
		case @sort_order
			when 0 then o.name
			when 1 then c.name
		end;



Теперь хотим этот список записать в символьную переменную. Сортировку пока зададим жестко. Тут тоже все окей, видим в переменной длинный список полей через запятую:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @col_list varchar(max) = '';
select
	@col_list += 
		CASE @col_list WHEN '' THEN '' ELSE ',' END 
		+ o.name + '.' + c.name
	from sys.columns as c
	join sys.objects as o on o.object_id = c.object_id
	order by o.name;
select @col_list;



А теперича хотим этот список не только в переменную загнать, но и увидеть отсортированным по нашему желанию:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @sort_order bit = 0;
declare @col_list varchar(max) = '';
select
	@col_list += 
		CASE @col_list WHEN '' THEN '' ELSE ',' END 
		+ o.name + '.' + c.name
	from sys.columns as c
	join sys.objects as o on o.object_id = c.object_id
	order by
		case @sort_order
			when 0 then o.name
			when 1 then c.name
		end;
select @col_list;


И опа! видим, что в переменную записалось только ОДНА (!) строка выборки.

Вопрос: как сделать, чтобы в переменную записалась вся выборка, а не одна-едиенственная строка, когда в ORDER BY стоит CASE? Наверняка кто-то сталкивался с этим.

Заранее большое спасибо.
SELECT @@VERSIONMicrosoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
Jun 17 2011 00:54:03
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit)
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411460
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411462
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
topic starter,

Вопрос: как сделать, чтобы в переменную записалась вся выборка, а не одна-едиенственная строка, когда в ORDER BY стоит CASE? Наверняка кто-то сталкивался с этим.

SQL это делать не умеет.
Это надо делать курсором на данный SELECT, в цикле накапливать переменную.
Либо можно ещё CONCAT AGREGATE , но не знаю, есть ли он в MSSQL сейчас.
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411488
topic starter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, спасибо за ссылку. Теперь стало понятно, что если разные планы генерируются, то предсказуемого результата ожидать нечего.

MasterZiv, про CONCAT AGGREGATE, к сожалению, не удалось ничего найти в BOL. А с курсором, конечно, неохота связываться, в производственной БД курсор станет тормозить на больших выборках.

Ладно, попробую обходные пути, подумаю еще.
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411501
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто надо делать курсором на данный SELECT, в цикле накапливать переменную
http://www.sql.ru/faq/faq_topic.aspx?fid=130
последние 2 варианта. Вариант с рекурсивным CTE не советую - очень медленный и прожорливый.
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411520
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
topic starterinvm, спасибо за ссылку. Теперь стало понятно, что если разные планы генерируются, то предсказуемого результата ожидать нечего.

MasterZiv, про CONCAT AGGREGATE, к сожалению, не удалось ничего найти в BOL. А с курсором, конечно, неохота связываться, в производственной БД курсор станет тормозить на больших выборках.

Ладно, попробую обходные пути, подумаю еще.

Выборка в промежуточную временную таблицу с правильным кластерным индексом - решает вашу проблему.
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411605
topic starter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks2, именно так и планировал сделать.
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411631
topic starter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,

этот вариант, который вы предложили, я знаю. Я им постоянно пользуюсь для конкатенации строк. В этот раз просто захотелось обойтись без FOR XML PATH, попробовать другой путь - похоже, зря захотелось :-)
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411642
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2Выборка в промежуточную временную таблицу с правильным кластерным индексом - решает вашу проблему.
обеспечивать корректность выборки за счёт структуры - несколько кривоватое решение. imho, решение с тем же for xml красивее
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411765
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
topic starterзахотелось обойтись без FOR XML PATH
Почему? Есть какие-то нарекания к запросам с этой инструкцией? Или просто захотелось, и всё?
Вот здесь: 14761519 дело дошло до сравнения производительности. Вариант с FOR XML оказался самым быстрым.
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411844
topic starter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,

нет, нареканий никаких нет, нормально работает for xml во всех запросах в базе. Просто захотелось как-то по-другому попробовать. Инициатива, как известно, наказуема :-) Что вариант for xml оказался самым производительным - это новость, интересно было узнать, спасибо.
...
Рейтинг: 0 / 0
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
    #38411864
мимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shakillaleks2Выборка в промежуточную временную таблицу с правильным кластерным индексом - решает вашу проблему.
обеспечивать корректность выборки за счёт структуры - несколько кривоватое решение.
Это не кривое решение, это понимание T-Sql.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]