Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
Ozzy The Terrible
ЗЫ. А кто-нибудь может объяснить, зачем вообще отсекать хвостовые пробелы БЕЗ явного применения функции rtrim(), если они есть в некоторой строке ?


Я же вам ответил, как это можно трактовать. Если вы в столбец фиксированной длины будете вводить значения с концевыми пробелами, то они будут все равно "утрачены", т.к. добьются пробелами до размера столбца, и сколько их было введено никто уже не скажет.
В противном случае нужно иметь префикс с указанием точной длины, но тогда теряется преимущество точного типа.
А размер столбца (данных) можно получить другой функцией - datalength().
Вот выполните на сайте такой запрос:

select name, len(name), datalength(name) from passenger
11 ноя 08, 22:43    [6426098]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
Serge_I
размер столбца (данных) можно получить другой функцией - datalength()
ooops!.. наверное, это будет очень смешно, но... я только сейчас, от Вас, про неё узнал
Почему об этой функции молчат Самая полезная книга и список строковых функций нового учебника ?
11 ноя 08, 23:01    [6426147]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
Ozzy The Terrible
Serge_I
размер столбца (данных) можно получить другой функцией - datalength()
ooops!.. наверное, это будет очень смешно, но... я только сейчас, от Вас, про неё узнал
Почему об этой функции молчат Самая полезная книга и список строковых функций нового учебника ?


В справке я уже об этом писал. А учебник я только начал вычитывать. По ходу буду править и дописывать. Требуется время, которого всегда не хватает. :-)
Кроме того, эта функция применяется к данным любого типа, возвращая размер:
select datalength(date) from battles
Размер возвращается в байтах:
select name,len(name),datalength(name), datalength(cast(name as nchar(20)))  from passenger
11 ноя 08, 23:21    [6426213]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
И всё-таки я снова в изумлении от особого взгляда M$ на операции со строками.
Правда, это относится не к функции LEN(), отсекающей хвостовые пробелы, а к LIKE-сопоставлению (см. топик на эту тему). Там мне дали хорошую ссылку, небольшой фрагмент из которой позвольте процитировать:
doc.ddart.net/mssql
When you use Unicode data (nchar or nvarchar data types) with LIKE, trailing blanks are significant; however, for non-Unicode data, trailing blanks are not significant.
Unicode LIKE is compatible with the SQL-92 standard. ASCII LIKE is compatible with earlier versions of SQL Server.

В результате имеем:
select len(N'10   ') /* result: 2 */
select datalength(N'10   ') /* result: 10 */
select len('10   ')   /* result: 2 */
select datalength('10   ') /* result: 5 */
select r=case when N'10 ' like N'1_' then 1 else 0 end /* result: 0 */
select r=case when '10 ' like '1_' then 1 else 0 end    /* result: 1 */

Если у них ASCII'шный LIKE совместим с "ранними версиями SS", а уникодный - со стандартом SQL-92, то почему они не удосужились применить этот же подход к функции LEN ? ведь первое выражение никак не должно давать 2, там же уникодная строка... :/
11 ноя 08, 23:24    [6426217]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
Ozzy The Terrible
ведь первое выражение никак не должно давать 2, там же уникодная строка... :/

Так LEN() возвращает не число байтов, а число символов в строке.
12 ноя 08, 00:04    [6426291]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
To Ozzy

> Вот этот простой запрос: select case when ',005,006,007' like NULL then 1 else 0 end

Хочу вернуться к этому вопросу. Странно, но факт.
Запрос
select case when ',005,006,007' like NULL then 1 else 0 end
дает 1,
а такой код
declare @chr varchar(20)
set @chr=',005,006,007'
select case when @chr like NULL then 1 else 0 end
дает 0.
У меня нет разумной версии происходящего.
Microsoft SQL Server 2005 - 9.00.3159.00 (Intel X86) Mar 23 2007 16:15:11 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)
19 ноя 08, 00:11    [6458770]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
У меня такой же результат, как у Вас.
Только версия немного другая:
Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

Может, кто из местных гуру даст разъяснения на эту тему ?
19 ноя 08, 06:15    [6459001]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
ЗЫ. Имхо, этот нюанс должен быть отражен в эл. учебнике жырным шрифтом (м.б. в разделе строковых функций ?). Хотя бы потому, что хостом решение будет проверяться на SS, а не "абстрактной SQL-машиной".
19 ноя 08, 08:25    [6459098]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
Еще один нюанс вспомнился, он тоже относится к строковым данным. Правда, это не по теме сравнения строки с шаблоном, а к вообще по данному топику.

Имхо, если в электронном учебнике будут материалы, посвященные СТЕ, то на указать следующее.
В рекурсивных CTE нельзя использовать поле типа char(nn), если на каком-то этапе (внутри рекурсии) это поле станет иметь размер, превышающий nn -- тот, который был указан для root-элемента. Нельзя даже применять к этому полю простые функции типа left(str, nn), где nn - то же самое значение, что в root-элементе (только что проверил). Будет вываливаться с ошибкой "несоответствие типов корневого и рекурсивного элемента", хотя тип и длина одинаковы.
Необходимо приводить к varchar; причем, если в цикле идёт увеличение длины этой строки до 30 и более байт, то varchar(max).
19 ноя 08, 08:38    [6459124]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
>У меня нет разумной версии происходящего.

да и нет ее. бага это явная. в 2000-ом и 2008-ом все, как и должно быть - выдается 0 в обоих случаях.

Posted via ActualForum NNTP Server 1.4

19 ноя 08, 08:47    [6459141]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
daw
>У меня нет разумной версии происходящего.

да и нет ее. бага это явная. в 2000-ом и 2008-ом все, как и должно быть - выдается 0 в обоих случаях.


Что баг - это понятно. Непонятно разное поведение.
Если бы значение выбиралось случайным образом, то не было бы повторяемости.
19 ноя 08, 16:19    [6462366]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
Ozzy The Terrible
ЗЫ. Имхо, этот нюанс должен быть отражен в эл. учебнике жырным шрифтом (м.б. в разделе строковых функций ?). Хотя бы потому, что хостом решение будет проверяться на SS, а не "абстрактной SQL-машиной".

Чтобы о чем-то написать, нужно это осмыслить. Я пока не могу. :-)
19 ноя 08, 16:22    [6462404]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
>Что баг - это понятно. Непонятно разное поведение.

в смысле, разное для константы и для переменной?
а вы планы посмотрите для обоих случаев:
set showplan_all on
go
select case when ',005,006,007' like NULL then 1 else 0 end from (select 1 c) t

declare @chr varchar(20) 
set @chr=',005,006,007' 
select case when @chr like NULL then 1 else 0 end  from (select 1 c) t

--select case when ',005,006,007' like NULL then 1 else 0 end from (select 1 c) t
--  |--Constant Scan(VALUES:(((1))))

--select case when @chr like NULL then 1 else 0 end  from (select 1 c) t
--  |--Constant Scan(VALUES:((CASE WHEN NULL THEN (1) ELSE (0) END)))

в случае с переменной есть честный like - соответственно, все как положено получаем.
а с константами оно оптимизируется. вот эта-то оптимизация и косячит.

Posted via ActualForum NNTP Server 1.4

19 ноя 08, 16:33    [6462510]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
To daw

Так и непонятно, почему планы разные. :-)
19 ноя 08, 19:46    [6463419]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
Serge_I
Чтобы о чем-то написать, нужно это осмыслить. Я пока не могу


Надо "через не могу" :)
Народ, который будет читать эл. учебник, много раз выскажет Вам благодарность за то, что Вы об этой засаде явно предупреждаете. По аналогии с переходом через субботу на воскресенье (подсчёт чего-то там с датами, не помню уже), а также с len(str)==len(rtrim(str)).
В конечном счёте, обучающий ресурс хотя и посвящен SQL как языку, но на сегодняшний момент практическое его освоение на sql-ex неизбежно приводит к натыканию на нюансы, заложенные мелкомягкими.

ЗЫ. "Двигаться вперёд, а понимание придёт" (С) Л.Д. Ландау
19 ноя 08, 19:58    [6463451]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Serge I
Так и непонятно, почему планы разные. :-)

Сергей,
Насколько я понимаю, в случае с константами оптимизатор еще до генерации плана вычислил значение выражения
case when ',005,006,007' like NULL then 1 else 0 end
каким-то своим внутренним механизмом. Ну как сумел... :)
19 ноя 08, 20:06    [6463466]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
То Anddros

Оффтоп.
Вы получили мое письмо по поводу вашей задачи?
Жду ответа. :-)
19 ноя 08, 21:13    [6463593]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
2 Serge_I: а есть ли на sql-tutorial.ru полнотекстовый поиск (да еще бы с учетом морфологии русского языка) ? А то искать по тегам не самая удобная вещь...
21 ноя 08, 09:18    [6469642]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
Ozzy The Terrible
2 Serge_I: а есть ли на sql-tutorial.ru полнотекстовый поиск (да еще бы с учетом морфологии русского языка) ? А то искать по тегам не самая удобная вещь...


Я просил поставить поиск от Гугл или аналогичный, напомню.
Поиск по тегам будет нормальным, просто сами теги еще только формируются.
21 ноя 08, 11:00    [6470298]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
2 Serge_I. Еще вопрос: а можно ли сделать тынц на содержание, представленное в максимально развёрнутом виде, т.е. все главы, подглавы, разделы и подразделы на одной странице ?
Сейчас наверху видны только самые общие разделы, дальше надо прыгать вниз, тогда там видны более детальные заголовки, и т.п.
А хотелось бы в одном флаконе, примерно как в Книге было. Тогда сразу будет легко найти, к примеру, материал по известному имени функции: datediff, stuff -- и т.п.
24 ноя 08, 00:01    [6477938]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
Ozzy The Terrible
2 Serge_I. Еще вопрос: а можно ли сделать тынц на содержание, представленное в максимально развёрнутом виде, т.е. все главы, подглавы, разделы и подразделы на одной странице ?
Сейчас наверху видны только самые общие разделы, дальше надо прыгать вниз, тогда там видны более детальные заголовки, и т.п.
А хотелось бы в одном флаконе, примерно как в Книге было. Тогда сразу будет легко найти, к примеру, материал по известному имени функции: datediff, stuff -- и т.п.


Так оно и было изначально в развернутом виде, но было длинно, и я предпочел структурировать. :-)
Но, пожалуй, возможность развернуть одним щелчком тоже будет не лишней.
Спасибо.
24 ноя 08, 01:40    [6478070]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
Имхо, надо обязательно делать заголовки максимально подробными (т.е. не просто "строковые функции" или "функции даты-времени", а с указанием их: "функция stuff", "функция reverse" etc). Тогда справка по известному имени функции будет получена максимально быстро: Ctrl-F и ввод имени.
24 ноя 08, 09:12    [6478274]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
Ozzy The Terrible
Имхо, надо обязательно делать заголовки максимально подробными (т.е. не просто "строковые функции" или "функции даты-времени", а с указанием их: "функция stuff", "функция reverse" etc). Тогда справка по известному имени функции будет получена максимально быстро: Ctrl-F и ввод имени.


Заголовок - это название страницы, где может быть рассмотрено несколько функций. Все же для этого лучше подойдет поиск по тегам. Тем более, что одна функция может упоминаться на нескольких страницах, и примеры ее использования тоже быть "размазанными" по тексту.
24 ноя 08, 15:10    [6480384]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Ozzy The Terrible
Guest
В главу 8 ("Готовимся ко второму этапу... Типичные проблемы") предлагаю ввести подразделы, которые могут сильно помочь неофитам в SS:
1) преобразование данных в столбце в строку через for xml path('')
2) примеры использования cross apply
3) примеры использования функций ранжирования
4) примеры отбора строк через
select top 1 with ties ...
from ...
order by <критерий_дающий_общий_результат_для_всех_отбираемых_строк>
5) неприятности при сравнении строки с шаблоном NULL (было выше в этом топике и в "Сравнении СУБД")
6) предупреждение о том, что в окно ввода решений (на сайте) нельзя вводить текст, содержащий символ ";" (точка с запятой), текст с двумя точками подряд (".."), а также текст, содержащий "exec" и т.п. (защита от инъекций)

Хотя эти фишки характерны именно для MS SQL 2005, но ведь все упражнения на sql-ex проверяются именно _этой_ СУБД, а не другой (по кр. мере, на сегодняшний день).
Учебник sql-tutorial повсюду ссылается на sql-ex, поэтому отражение как можно большего числа особенностей (полезных и не очень :)) именно MS SQL было бы очень кстати...
25 ноя 08, 16:04    [6485575]     Ответить | Цитировать Сообщить модератору
 Re: Новый обучающий ресурс по SQL  [new]
Serge I
Member

Откуда: Ростов-на-Дону
Сообщений: 484
To Ozzy The Terrible
Почти по всем пунктам я и собирался написать.
Спасибо, что напомнили. :-)
25 ноя 08, 19:19    [6486708]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить