powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Условие в запросе
12 сообщений из 37, страница 2 из 2
Условие в запросе
    #38334172
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
капец полныйно ответьте плиз, откуда такой огород, почему не подходит
Код: sql
1.
where code = -1 and f1 = -1

Потому что написанные выше условия BETWEEN эквивалентны
Код: sql
1.
WHERE code IS NOT NULL AND f1 IS NOT NULL

а не тем, что Вы написали.
...
Рейтинг: 0 / 0
Условие в запросе
    #38334174
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
капец полныйПрогер_самоучка,

тип полей тут вообще ни при чем,
любое из этох двух вызовет ту же ошибку:
Код: sql
1.
2.
select isnull(nullif(-1,-1),-2147483648)
select isnull(nullif(-1,-1),2147483647)


Я понимаю, иначе вопроса не было бы)

капец полныйно ответьте плиз, откуда такой огород, почему не подходит
Код: sql
1.
where code = -1 and f1 = -1


Чуть выше описано почему сделано именно так. Если было так просто, я бы не стал усложнять себе жизнь.
...
Рейтинг: 0 / 0
Условие в запросе
    #38334197
извиняюсь, да, я "не в теме",
т.к. там перерыв между постами и начало осталось непрочтенным.
могу только предположить, что у него изменилось поведение по приведению типов
вот такое

Код: sql
1.
2.
3.
select  SQL_VARIANT_PROPERTY(-1, 'basetype')
       ,SQL_VARIANT_PROPERTY(nullif(-1,-1), 'basetype')
       --,SQL_VARIANT_PROPERTY(isnull(nullif(-1,-1),-2147483648), 'basetype')


показывает, что на этапе nullif(-1,-1), тип выражения не определен.
ну и раскомментарив последнюю строку, имеем ту же ошибку.
т.е. он от типа NULL перешел почему-то к SMALLINT,
а 2000-ый наверное честно оценивал второй аргумент и понимал, что все приводится к INT
...
Рейтинг: 0 / 0
Условие в запросе
    #38334203
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
=)8)а тип параметра какой? Скорее всего, что-то вроде этого:
Код: sql
1.
2.
3.
4.
5.
6.
declare @code smallint=-1
...
select ...
where ...
   and code between isnull(nullif(@code,-1),-2147483648) and isnull(nullif(@code,-1),2147483647)
...

исправьте тип на int - ошибка уйдет
@code- это значения из поля формы. Они берутся из таблиц и все имеют тип int.
...
Рейтинг: 0 / 0
Условие в запросе
    #38334210
тем не менее, насильное указание типа помогает:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @code int=-1
select isnull(nullif(@code,-1),-2147483648)
-----------------------------------------
 -2147483648

declare @code_sm smallint=-1
select isnull(nullif(@code_sm,-1),-2147483648) 
-----------------------------------------
Msg 220, Level 16, State 1, Line 2
Arithmetic overflow error for data type smallint, value = -2147483648.
...
Рейтинг: 0 / 0
Условие в запросе
    #38334228
При выполнении запроса SQL смотрит не на тип поля данных, а определяет тип по результату операции, переведите результат в формат int и будет вам счастье
Код: sql
1.
isnull(nullif(convert(int, @code),-1),-2147483648), isnull(nullif(convert(int, @code),-1),2147483647) 
...
Рейтинг: 0 / 0
Условие в запросе
    #38334235
ну, кажись да, если ему тип насильно не указать,
он считает, что SMALLINT

Код: sql
1.
2.
3.
select  SQL_VARIANT_PROPERTY(-1, 'basetype')
       ,SQL_VARIANT_PROPERTY(nullif(-1,-1), 'basetype')
       ,SQL_VARIANT_PROPERTY(isnull(nullif(-1,-1),-33), 'basetype')



-----------------------
int NULL smallint
...
Рейтинг: 0 / 0
Условие в запросе
    #38334242
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
капец полныйну, кажись да, если ему тип насильно не указать,
он считает, что SMALLINT

Код: sql
1.
2.
3.
select  SQL_VARIANT_PROPERTY(-1, 'basetype')
       ,SQL_VARIANT_PROPERTY(nullif(-1,-1), 'basetype')
       ,SQL_VARIANT_PROPERTY(isnull(nullif(-1,-1),-33), 'basetype')




-----------------------
int NULL smallintЭто потому, что для -1 минимальный по размеру целый тип - SMALLINT.
Если не ошибаюсь, такое поведение (и много других сюрпризов с типами) началось с SQL2005.
И, кстати, в своё время здесь это обсуждалось неоднократно.
...
Рейтинг: 0 / 0
Условие в запросе
    #38334250
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот почему -2147483648 приводится к типу SMALLINT, - вот что непонятно.
Ибо логично было бы и этот литерал преобразовать к минимальному для него типу INT,
а потом оба аргумента к типу с бОольшим приоритетом, то есть, INT
...
Рейтинг: 0 / 0
Условие в запросе
    #38334272
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир МеньшиковПри выполнении запроса SQL смотрит не на тип поля данных, а определяет тип по результату операции, переведите результат в формат int и будет вам счастье
Код: sql
1.
isnull(nullif(convert(int, @code),-1),-2147483648), isnull(nullif(convert(int, @code),-1),2147483647) 


Пытался сначала это сделать в программе функцией CInt (VBA). Но в итоге сервер снова приводил к smallint.
Воспользовался вашим советом. Большое спасибо.

З.Ы. Остальным участникам тоже спасибо за активное участие и помощь.
...
Рейтинг: 0 / 0
Условие в запросе
    #38334274
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapА вот почему -2147483648 приводится к типу SMALLINT, - вот что непонятно.
Ибо логично было бы и этот литерал преобразовать к минимальному для него типу INT,
а потом оба аргумента к типу с бОольшим приоритетом, то есть, INT
потому что ISNULL так работает - пытается вернуть результат с типом первого аргумента
Код: sql
1.
select isnull(cast(null as smallint), -2147483648)
...
Рейтинг: 0 / 0
Условие в запросе
    #38334284
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakilliapА вот почему -2147483648 приводится к типу SMALLINT, - вот что непонятно.
Ибо логично было бы и этот литерал преобразовать к минимальному для него типу INT,
а потом оба аргумента к типу с бОольшим приоритетом, то есть, INT
потому что ISNULL так работает - пытается вернуть результат с типом первого аргумента
Код: sql
1.
select isnull(cast(null as smallint), -2147483648)

Да. Запамятовал что-то.
Причём сейчас ясно вспомнил, как мы когда-то это обсуждали.
Кстати, COALESCE ведёт себя совершенно иначе -
приводит все свои аргументы к типу с максимальным приоритетом.
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Условие в запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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