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

Откуда: Санкт-Петербург
Сообщений: 15574
Два запроса (см ниже) Возвращаемые ими значения
Всегда будут равны между собой
10,0%
 (1)
Не всегда будут равны между собой
80,0%
 (8)
Никогда не будут равны между собой.
10,0%
 (1)
Голосование открыто только для зарегистрированных пользователей.
Проголосовало: 10  

Есть два запроса
select COUNT(v12047) b from Stt where V12047='П1'
select COUNT(v12047) c from Stt where V12047+'А'='П1'+'А'

оба нормально отрабатывают и выдают результат (количество строчек соответственно)

Вопрос: равно ли значение возвращаемое первым запросом значению возвращаемому вторым?
в каких случаях может быть неравно и почему (если может быть)

Для порядку. Таблица статична (записи не удаляются не добавляются и не изменяются)
7 ноя 12, 12:00    [13431758]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
super-code
Member

Откуда:
Сообщений: 244
DKey, юникод?
7 ноя 12, 12:03    [13431803]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
Glory
Member

Откуда:
Сообщений: 104751
Что такое "Не всегда будут равны между собой " ?
Через раз равны/не равны ? Или для разных таблиц ? Или для разных баз/серверов ?
7 ноя 12, 12:09    [13431879]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
концевые пробелы, поди.
declare @Stt table (v12047 nvarchar(100))
insert into @Stt values (N'П1   ')

select COUNT(v12047) b from @Stt Stt where V12047='П1'
select COUNT(v12047) c from @Stt Stt where V12047+'А'='П1'+'А'
7 ноя 12, 12:15    [13431939]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Для начала, какого типа V12047?
7 ноя 12, 12:15    [13431947]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
daw
концевые пробелы, поди.
declare @Stt table (v12047 nvarchar(100))
insert into @Stt values (N'П1   ')

select COUNT(v12047) b from @Stt Stt where V12047=N'П1'
select COUNT(v12047) c from @Stt Stt where V12047+N'А'=N'П1'+N'А'
Поправил
На всякий случай и для порядка...
7 ноя 12, 12:18    [13431970]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
Crimean
Member

Откуда:
Сообщений: 13147
daw
концевые пробелы, поди


а можно и тип данных сделать "просто char, без var" + конекшен сеты - тот же результат будет
7 ноя 12, 12:18    [13431975]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
DKey
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 15574
Glory
Что такое "Не всегда будут равны между собой " ?
Через раз равны/не равны ? Или для разных таблиц ? Или для разных баз/серверов ?


Одна и та же таблица, одна и та же база данных. Запросы выполняются к одной и той же таблице с разницей в секунду - набор данных не меняется.
7 ноя 12, 12:20    [13431991]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
daw,

проверять сейчас нет времени,
но для VARCHAR важно ещё и ANSI_PADDING при создании таблицы, если не ошибаюсь?
7 ноя 12, 12:20    [13431995]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
DKey
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 15574
iap
Для начала, какого типа V12047?


Если я скажу, будет неинтересно :-)
7 ноя 12, 12:20    [13431999]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
DKey
iap
Для начала, какого типа V12047?


Если я скажу, будет неинтересно :-)
Так это загадка такая? Надо было сразу сказать...
Тогда ответ уже дали - про хвостовые пробелы
7 ноя 12, 12:22    [13432017]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
DKey
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 15574
Кароче - тут походу уже догадались.
у поля тип Char(9) старые версии скуля отрицали тот факт что v12047 может быть равен 'П1' Он должен быть равен 'П1 '
теперь скуль этого не отрицает и услужливо обрезает пробелы. НО!
когда я в репорт сервисе попытался забацать запрос со значениями по умолчанию они нифига не установились - потому как репортсервисес еще по старинке нормально считает что в чаре9 должно быть ДЕВЯТЬ символов не больше ни меньше
А вот скуль с**а даже при Len(v12047) выдает 2
7 ноя 12, 12:24    [13432037]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
iap
проверять сейчас нет времени,
но для VARCHAR важно ещё и ANSI_PADDING при создании таблицы, если не ошибаюсь?


для char тоже, вроде как. для юникода не важно.
7 ноя 12, 12:29    [13432070]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
Glory
Member

Откуда:
Сообщений: 104751
DKey
А вот скуль с**а даже при Len(v12047) выдает 2

Функция Len ВСЕГДА игнорировала концевые пробелы
7 ноя 12, 12:34    [13432111]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
а для char еще и SET ANSI_NULL_DFLT сыграть роль может.

так что, подозреваю, что дело все же не в версии сервера.
7 ноя 12, 12:35    [13432118]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
Glory
Member

Откуда:
Сообщений: 104751
DKey
Кароче - тут походу уже догадались.
у поля тип Char(9) старые версии скуля отрицали тот факт что v12047 может быть равен 'П1' Он должен быть равен 'П1 '
теперь скуль этого не отрицает и услужливо обрезает пробелы. НО!

Про какие "старые версии" вы говорите ??

проверил скрипт
declare @t table(f1 char(9))
insert @t values('P1')
insert @t values('P2')

select * from @t where f1 = 'P1'

на 2000, 2005 и 2008R2 - везде выдается 1 запись
7 ноя 12, 12:38    [13432154]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
Glory
Member

Откуда:
Сообщений: 104751
А соответственно

select * from @t where f1+'A' = 'P1'+'A'

на всех этих версиях возвращал пустой набор.
7 ноя 12, 12:57    [13432350]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на сообразительность MSSQL2008R2  [new]
DKey
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 15574
Эххх хначит я зря надеялся что на старых версия это было однозначно
7 ноя 12, 21:42    [13436162]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить