|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
Всем привет. Ну вот хотим мы посмотреть список полей в таблицах, сортируя (по желанию) или по названию таблицы, или по названию поля. Тут все окей, видим длинный список: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Теперь хотим этот список записать в символьную переменную. Сортировку пока зададим жестко. Тут тоже все окей, видим в переменной длинный список полей через запятую: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
А теперича хотим этот список не только в переменную загнать, но и увидеть отсортированным по нашему желанию: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
И опа! видим, что в переменную записалось только ОДНА (!) строка выборки. Вопрос: как сделать, чтобы в переменную записалась вся выборка, а не одна-едиенственная строка, когда в 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) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 10:32 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 10:42 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
topic starter, Вопрос: как сделать, чтобы в переменную записалась вся выборка, а не одна-едиенственная строка, когда в ORDER BY стоит CASE? Наверняка кто-то сталкивался с этим. SQL это делать не умеет. Это надо делать курсором на данный SELECT, в цикле накапливать переменную. Либо можно ещё CONCAT AGREGATE , но не знаю, есть ли он в MSSQL сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 10:43 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
invm, спасибо за ссылку. Теперь стало понятно, что если разные планы генерируются, то предсказуемого результата ожидать нечего. MasterZiv, про CONCAT AGGREGATE, к сожалению, не удалось ничего найти в BOL. А с курсором, конечно, неохота связываться, в производственной БД курсор станет тормозить на больших выборках. Ладно, попробую обходные пути, подумаю еще. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:04 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
MasterZivЭто надо делать курсором на данный SELECT, в цикле накапливать переменную http://www.sql.ru/faq/faq_topic.aspx?fid=130 последние 2 варианта. Вариант с рекурсивным CTE не советую - очень медленный и прожорливый. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:11 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
topic starterinvm, спасибо за ссылку. Теперь стало понятно, что если разные планы генерируются, то предсказуемого результата ожидать нечего. MasterZiv, про CONCAT AGGREGATE, к сожалению, не удалось ничего найти в BOL. А с курсором, конечно, неохота связываться, в производственной БД курсор станет тормозить на больших выборках. Ладно, попробую обходные пути, подумаю еще. Выборка в промежуточную временную таблицу с правильным кластерным индексом - решает вашу проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 11:22 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
aleks2, именно так и планировал сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 12:10 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, этот вариант, который вы предложили, я знаю. Я им постоянно пользуюсь для конкатенации строк. В этот раз просто захотелось обойтись без FOR XML PATH, попробовать другой путь - похоже, зря захотелось :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 12:24 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
aleks2Выборка в промежуточную временную таблицу с правильным кластерным индексом - решает вашу проблему. обеспечивать корректность выборки за счёт структуры - несколько кривоватое решение. imho, решение с тем же for xml красивее ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 12:30 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
topic starterзахотелось обойтись без FOR XML PATH Почему? Есть какие-то нарекания к запросам с этой инструкцией? Или просто захотелось, и всё? Вот здесь: 14761519 дело дошло до сравнения производительности. Вариант с FOR XML оказался самым быстрым. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 13:41 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, нет, нареканий никаких нет, нормально работает for xml во всех запросах в базе. Просто захотелось как-то по-другому попробовать. Инициатива, как известно, наказуема :-) Что вариант for xml оказался самым производительным - это новость, интересно было узнать, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 14:11 |
|
SELECT странно присваивает значение переменной, если ORDER BY вместе с CASE
|
|||
---|---|---|---|
#18+
Shakillaleks2Выборка в промежуточную временную таблицу с правильным кластерным индексом - решает вашу проблему. обеспечивать корректность выборки за счёт структуры - несколько кривоватое решение. Это не кривое решение, это понимание T-Sql. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2013, 14:24 |
|
|
start [/forum/topic.php?fid=46&msg=38411462&tid=1705159]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
186ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 234ms |
total: | 524ms |
0 / 0 |