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

Откуда:
Сообщений: 223
Добрый день.

Подскажите с селектом.

есть таблица.
create table #table1(aa char(50))

insert into #table1
select 'aa'
union all
select 'bb'

Мне нужно выбрать не 2 строки, а одну, содержащую 2 - 'aabb'
Это можно сделать без курсора?
11 июн 09, 17:05    [7291658]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
RX
Member

Откуда:
Сообщений: 6
ну как-то так:
select RTRIM(aa) as 'data()' 
from	#table1
for xml path('')
11 июн 09, 17:16    [7291734]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, а если сервер не 2005, а ниже, то - https://www.sql.ru/faq/faq_topic.aspx?fid=130
14 июн 09, 09:05    [7297043]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
RX
ну как-то так:
select RTRIM(aa) as 'data()' 
from	#table1
for xml path('')
И получается, как надо?
create table #table1(aa varchar(50))

insert into #table1
select 'aa' 
union all
select 'bb'

select aa from
(
 select ''+aa
 from	#table1
 for xml path('')
)t(aa)
14 июн 09, 11:16    [7297085]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
Nicola_r
Member

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

Мне видится три варианта:
1) процедура, там курсор собирает все в строку
2) for xml path
3) или агрегатная функция CLR

я за первый вариант :)

https://www.sql.ru/forum/actualthread.aspx?tid=543769
14 июн 09, 15:45    [7297426]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iljy
Guest
Checkpoint,

а вот так не подойдет?
declare @s varchar(max)
set @s = ''
select @s = @s + rtrim(aa)
from #table1

select @s

стандартное решение для таких задач
14 июн 09, 16:04    [7297458]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
Checkpoint,

а вот так не подойдет?
declare @s varchar(max)
set @s = ''
select @s = @s + rtrim(aa)
from #table1

select @s

стандартное решение для таких задач
Не только не стандартное, но и недокументированное!

Вообще-то на этот способ tpg уже давал здесь ссылку.

Nicola_r, Вы мне что хотели сказать-то? Курсоры форева что ли?
Так я этой болезнью давно переболел.
Иногда курсоры хороши. Но очень-очень редко.
14 июн 09, 16:24    [7297475]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iljy
Guest
iap
iljy
Checkpoint,

а вот так не подойдет?
declare @s varchar(max)
set @s = ''
select @s = @s + rtrim(aa)
from #table1

select @s

стандартное решение для таких задач
Не только не стандартное, но и недокументированное!

чой-то оно недокументированное??
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.SQL.v2005.en/tsqlref9/html/8e1a9387-2c5d-4e51-a1fd-a2a95f026d6f.htm
SELECT @localvariable
а то, что выражение может содержать саму переменную - можно и догадаться. я в свое время догадался
iap

Вообще-то на этот способ tpg уже давал здесь ссылку.

давал, но ее почему-то проигнорировали. может потому, что там более общий и ,как следствие, сложный случай рассматривается
14 июн 09, 16:46    [7297519]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
чой-то оно недокументированное??
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.SQL.v2005.en/tsqlref9/html/8e1a9387-2c5d-4e51-a1fd-a2a95f026d6f.htm
SELECT @localvariable
а то, что выражение может содержать саму переменную - можно и догадаться. я в свое время догадался
Чой-то не могу зайти на Ваш компьютер!
Может, нормальную ссылку на MSDN дадите (http://msdn.microsoft.com/ru-ru/library/bb418431(SQL.10).aspx)?
Или сам текст здесь в спойлере выложите?
А то я не понимаю, о чём Вы говорите.
Слова "можно и догадаться" и "чой-то оно недокументированное??" несовместимы. IMHO
14 июн 09, 17:44    [7297625]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
Nicola_r
Member

Откуда:
Сообщений: 12
iap

Nicola_r, Вы мне что хотели сказать-то? Курсоры форева что ли?
Так я этой болезнью давно переболел.
Иногда курсоры хороши. Но очень-очень редко.


что-то я перепутал температуру кипения воды с прямым углом :) , конечно for xml path.
Дело не в том что курсоры плохо, а в том что for xml path работает действительно очень быстро (6 млн int собираются в строку приблизительно за 30 сек на обычном ноуте), и не требует в общем то дополнительных телодвижений.
14 июн 09, 17:55    [7297639]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iljy
Guest
iap
iljy
чой-то оно недокументированное??
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.SQL.v2005.en/tsqlref9/html/8e1a9387-2c5d-4e51-a1fd-a2a95f026d6f.htm
SELECT @localvariable
а то, что выражение может содержать саму переменную - можно и догадаться. я в свое время догадался
Чой-то не могу зайти на Ваш компьютер!
Может, нормальную ссылку на MSDN дадите (http://msdn.microsoft.com/ru-ru/library/bb418431(SQL.10).aspx)?
Или сам текст здесь в спойлере выложите?
А то я не понимаю, о чём Вы говорите.

в некоторых случаях BOL умеет открывать такие ссылки, на другой случай я привел ключевые слова для поиска. но если уж так - вот.
iap

Слова "можно и догадаться" и "чой-то оно недокументированное??" несовместимы. IMHO

Даже для документированных конструкций "догадываться" приходится о многом, например после описания оператора CREATE TABLE ( http://technet.microsoft.com/ru-ru/library/ms174979(SQL.90).aspx ) приходится "догадываться", что столбцов в таблице может быть больше одного и они могут иметь тип отличный от INT PRIMARY KEY ;) а в статье, про которую говорю я, есть прямое указание, что переменной может присваиваться любое допустимое выражение. Если уж это "недокументированное решение" - тогда просветите меня, что такое "документированное"!
14 июн 09, 21:16    [7297937]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Следует иметьв виду, что for xml path некоторые символы в строковых типах данных автоматом приведет к виду эскейп-последовательностей...
15 июн 09, 06:28    [7298424]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
но если уж так - вот
И где там хотя бы намёк на то, что значения колонки в строках могут накапливаться в переменной, если её использовать в выражении?
Там написано:
BOL - Замечания
Если инструкция SELECT возвращает более одного значения, переменной присваивается последнее возвращенное значение.
Последнее значение - это же не результат выполнения выражения в цикле?
15 июн 09, 09:05    [7298539]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iljy
Guest
iap
iljy
но если уж так - вот
И где там хотя бы намёк на то, что значения колонки в строках могут накапливаться в переменной, если её использовать в выражении?
Там написано:
BOL - Замечания
Если инструкция SELECT возвращает более одного значения, переменной присваивается последнее возвращенное значение.
Последнее значение - это же не результат выполнения выражения в цикле?

правильно - последнее возвращенное значение. Но - написано "expression - любое допустимое выражение", и нигде не написано что в выражении не может использоваться сама переменная. Думаю также, что ни в одном учебнике или доках по ЯПам не пишут явно о допустимости кострукции x = x + 15, тем неменее надеюсь, что накапливать результат в цикле умеют даже современные школьники. И если применить эту конструкцию - "последним возвращенным значением" как раз и будет "результат выполнения выражения в цикле". Итого - в данном алгоритме не используется ни одной конструкции SQL, не описанной явно в BOL. В общем вы меня не убедили :) хотя конечно если приведете критерии, по которым вы определяете, документирована конструкция языка или нет - дискуссию можно будет продолжить.
15 июн 09, 10:12    [7298753]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
daw
Member

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

> В общем вы меня не убедили :)

такая ссылка убедит?
http://support.microsoft.com/default.aspx?scid=287515
тут разработчики сервера признаются, что, в некоторых случаях, как минимум,
за результат aggregate concatenation query они не ручаются.

Posted via ActualForum NNTP Server 1.4

15 июн 09, 10:19    [7298772]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iljy
Guest
daw

> В общем вы меня не убедили :)

такая ссылка убедит?
http://support.microsoft.com/default.aspx?scid=287515
тут разработчики сервера признаются, что, в некоторых случаях, как минимум,
за результат aggregate concatenation query они не ручаются.

ссылка интересная, спасибо большое! но:

An aggregate concatenation query is a query that combines the values of multiple rows into one row.

т.е. здесь дается определение данного действия, причем не говорится "не делайте так, это нестандартная возможность", но

In order to achieve the expected results from an aggregate concatenation query, apply any Transact-SQL function or expression to the columns in the SELECT list rather than in the ORDER BY clause.

т.е. сами разработки документируют данную возможность как имеющую баг (или фичу ;) ), и дают пути его обхода:)
так что ваша ссылка как раз показывает, что возможность документирована, причем вместе с багами
15 июн 09, 10:48    [7298876]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iljy
iap
iljy
но если уж так - вот
И где там хотя бы намёк на то, что значения колонки в строках могут накапливаться в переменной, если её использовать в выражении?
Там написано:
BOL - Замечания
Если инструкция SELECT возвращает более одного значения, переменной присваивается последнее возвращенное значение.
Последнее значение - это же не результат выполнения выражения в цикле?

правильно - последнее возвращенное значение. Но - написано "expression - любое допустимое выражение", и нигде не написано что в выражении не может использоваться сама переменная. Думаю также, что ни в одном учебнике или доках по ЯПам не пишут явно о допустимости кострукции x = x + 15, тем неменее надеюсь, что накапливать результат в цикле умеют даже современные школьники. И если применить эту конструкцию - "последним возвращенным значением" как раз и будет "результат выполнения выражения в цикле". Итого - в данном алгоритме не используется ни одной конструкции SQL, не описанной явно в BOL. В общем вы меня не убедили :) хотя конечно если приведете критерии, по которым вы определяете, документирована конструкция языка или нет - дискуссию можно будет продолжить.
Чего-то не понял, по-Вашему слово "expression" включает в себя понятие цикла?
Вам не кажется, что логичнее было бы, если бы запрос
DECLARE @X INT;
SET @X=55;
DECLARE @T TABLE(X INT);
INSERT @T(X) SELECT 5 UNION ALL SELECT 10 UNION ALL SELECT 100;
SELECT @X=@X+X FROM @T ORDER BY X;
PRINT @X;
вернул 155, а не 170 (последнее значение=100; 100+55=155)? Прослеживалась бы хоть какая-то связь с документацией.
15 июн 09, 10:58    [7298944]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
daw
Member

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

> т.е. сами разработки документируют данную возможность как имеющую баг
> (или фичу ;) ), и дают пути его обхода:)
> так что ваша ссылка как раз показывает, что возможность документирована,
> причем вместе с багами

ну, можно еще здесь попробовать топики на тему поискать.
вот, например:
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=609597

здесь, вроде как, все согласно рекомендации - функция применяется не
в order by, а в select-листе, но все равно, по словам автора,
не работает как надо.

то есть, воркераунд, получается, только для конкретного приведенного
в статье примера. :(
в общем же случае никто и ничего, видимо, не гарантирует. повезет с
планом - будет счастье, а не повезет - ну, не судьба.

Posted via ActualForum NNTP Server 1.4

15 июн 09, 11:09    [7299001]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
daw
Member

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

вот еще:
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=575496

Posted via ActualForum NNTP Server 1.4

15 июн 09, 11:14    [7299033]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iljy
Guest
daw,
вы знаете, по крайней мере запрос по этой https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=575496 ссылке у меня отрабатывает корректно в обоих случаях, причем даже если я меняю сортировку на обратную. вторую ссылку повторить не смог - нет одной из таблиц, со временной таблицей - все и у автора работало. Версия -
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Workgroup Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

по сравнению планов заметил, что сбой возникает в случае, когда планировщик по каким-то соображениям ставит сортировку после вычисления выражения. но по-моему это скорее глюк планировщика, ибо по описанию http://technet.microsoft.com/ru-ru/library/ms187330(SQL.90).aspx ниоткуда не следует, что SELECT может в каких-то случаях возвращать одно значение вместо всей выборки.
вообще по-моему спор ушел несколько в другую плоскость - между документированной конструкцией и конструкцией корректно работающей есть некоторая разница :)
15 июн 09, 12:33    [7299532]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
daw
Member

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

> вы знаете, по крайней мере запрос по этой
> https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=575496 ссылке у
> меня отрабатывает корректно в обоих случаях, причем даже если я меняю
> сортировку на обратную. вторую ссылку повторить не смог - нет одной из
> таблиц, со временной таблицей - все и у автора работало. Версия -
> Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008
> 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Workgroup Edition
> on Windows NT 5.1 (Build 2600: Service Pack 2)

да, собственно, и у меня тоже. но сам факт. ну, неужели же, все до
одного авторы подобных топиков (а их и еще есть - это только то, что
я сходу по своей цитате нашел) нагло врут?

> по сравнению планов заметил, что сбой возникает в случае, когда
> планировщик по каким-то соображениям ставит сортировку после вычисления
> выражения.

ага. у меня (и не только) такое же впечатление сложилось.
для обычного запроса в этом как раз ничего страшного и нет.
потому-то такая перестановка и используется.

> вообще по-моему спор ушел несколько в другую плоскость - между
> документированной конструкцией и конструкцией корректно работающей есть
> некоторая разница :)

нууууу. я все же не стану называть подобную конструкцию документированной, пока
не будет четко описано, как именно она должна отрабатывать.
потому как, фокус-то этот совсем не очевидный, на мой взгляд.
всеже, ясного описания ни в документации ни в стандарте нет. в приведенной
статье сказано: "The correct behavior for an aggregate concatenation query
is undefined." - на это разработчики и ссылаются в ответ на возражения о
некорректной работе. то есть, багом они непредсказуемое поведение такого запроса,
я так понимаю, не считают, и исправлять это никто не будет. :(

Posted via ActualForum NNTP Server 1.4

15 июн 09, 13:51    [7300101]     Ответить | Цитировать Сообщить модератору
 Re: результат select'а одной строкой  [new]
iljy
Guest
daw

да, собственно, и у меня тоже. но сам факт. ну, неужели же, все до
одного авторы подобных топиков (а их и еще есть - это только то, что
я сходу по своей цитате нашел) нагло врут?

я не утверждаю что врут! я говорю что это глюк:)
daw

> по сравнению планов заметил, что сбой возникает в случае, когда
> планировщик по каким-то соображениям ставит сортировку после вычисления
> выражения.

ага. у меня (и не только) такое же впечатление сложилось.
для обычного запроса в этом как раз ничего страшного и нет.
потому-то такая перестановка и используется.

конечно нет, причем это единственно верное решение если ORDER BY идет по выражению. Вот только непонятно, почему в этом случае sort выдает одну строку, хотя в подсказке к плану указано верное количество строк
daw

нууууу. я все же не стану называть подобную конструкцию документированной, пока
не будет четко описано, как именно она должна отрабатывать.
потому как, фокус-то этот совсем не очевидный, на мой взгляд.
всеже, ясного описания ни в документации ни в стандарте нет. в приведенной
статье сказано: "The correct behavior for an aggregate concatenation query
is undefined." - на это разработчики и ссылаются в ответ на возражения о
некорректной работе. то есть, багом они непредсказуемое поведение такого запроса,
я так понимаю, не считают, и исправлять это никто не будет. :(

скорее всего не будут, но это больше похоже на отмазку.
15 июн 09, 14:48    [7300478]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить