Ошибка в SQL Server?

bbobsky
Уже с Приветом
Posts: 302
Joined: 02 Nov 2001 10:01

Ошибка в SQL Server?

Post by bbobsky »

Посмотрите позжaлуйста на это код:

create table #varhar_table
(
vachar_colum varchar(1000)
)

create table #numric_tble
(
numeric_column numeric(4, 0)
)

insert into #numric_tble (numeric_column) values(200);
insert into #varhar_table (vachar_colum) select isnull(numeric_column, '') from #numric_tble

Последний insert выдает ошибку: "Error converting data type varchar to numeric." , хотя я вроде бы convert в другую сторону.
Кто знает почему это происхоит?

P.S. Починить это легко - надо сперва convert to varchar а потом isnull().
User avatar
Колхозник
Уже с Приветом
Posts: 9269
Joined: 31 Jul 2003 19:17
Location: Шишконсин

Re: Ошибка в SQL Server?

Post by Колхозник »

bbobsky wrote:Посмотрите позжaлуйста на это код:

create table #varhar_table
(
vachar_colum varchar(1000)
)

create table #numric_tble
(
numeric_column numeric(4, 0)
)

insert into #numric_tble (numeric_column) values(200);
insert into #varhar_table (vachar_colum) select isnull(numeric_column, '') from #numric_tble

Последний insert выдает ошибку: "Error converting data type varchar to numeric." , хотя я вроде бы convert в другую сторону.
Кто знает почему это происхоит?

P.S. Починить это легко - надо сперва convert to varchar а потом isnull().


Ну вот это шо за ерунда?

isnull(numeric_column, '')

Видно же что функция ISNULL не могет несовместимые типы сама конвертировать. Блин, кто должон за вас API то читать? Пушкин?

Is the expression to be returned if check_expression is NULL. replacement_value must have the same type as check_expresssion.


http://msdn2.microsoft.com/en-us/librar ... 210(sql.80).aspx
Надоело. Самозабанен 11 ноября, 2015 - ....
bbobsky
Уже с Приветом
Posts: 302
Joined: 02 Nov 2001 10:01

Post by bbobsky »

Это они перестраховываются. Оно отлично конвертирует все остальные datatypes. Хотя конечно I see the point.
Спасибо.
User avatar
Колхозник
Уже с Приветом
Posts: 9269
Joined: 31 Jul 2003 19:17
Location: Шишконсин

Post by Колхозник »

bbobsky wrote:Это они перестраховываются. Оно отлично конвертирует все остальные datatypes. Хотя конечно I see the point.
Спасибо.


Ну и как конвертировать '' в число?? :D

Тут нечего умничать. Есть официальный API и все.
Надоело. Самозабанен 11 ноября, 2015 - ....
User avatar
Колхозник
Уже с Приветом
Posts: 9269
Joined: 31 Jul 2003 19:17
Location: Шишконсин

Post by Колхозник »

Справедливости ради решил тут добавить (как раз нашел баг где isnull(integer, '') исправно возвращало нули вместо пустой строчки). :angry:

Читаю в SQL 2000 спеке:
http://msdn2.microsoft.com/en-us/librar ... 210(sql.80).aspx

Transact-SQL Reference (SQL Server 2000)
ISNULL
Replaces NULL with the specified replacement value.

Syntax
ISNULL ( check_expression , replacement_value )

Arguments
check_expression

Is the expression to be checked for NULL. check_expression can be of any type.

replacement_value

Is the expression to be returned if check_expression is NULL. replacement_value must have the same type as check_expresssion.

Return Types
Returns the same type as check_expression.

Remarks
The value of check_expression is returned if it is not NULL; otherwise, replacement_value is returned.


А работает совсем не по спеку (вроде не должно даже компилироваться) :

Code: Select all

declare @i int
select isnull(@i, ' ')
select isnull(@i, '')
-----------
0
(1 row(s) affected)
-----------
0
(1 row(s) affected)


Читаю на SQL 2005:
http://msdn2.microsoft.com/en-us/library/ms184325.aspx

SQL Server 2005 Books Online (September 2007)
ISNULL (Transact-SQL)

Replaces NULL with the specified replacement value.

Transact-SQL Syntax Conventions

Syntax


ISNULL ( check_expression , replacement_value )
Arguments

check_expression
Is the expression to be checked for NULL. check_expression can be of any type.

replacement_value
Is the expression to be returned if check_expression is NULL. replacement_value must be of a type that is implicitly convertible to the type of check_expresssion.

Return Types

Returns the same type as check_expression.



А работает по спеку (потихоньку изменяет '' на 0 :angry: ) :

Code: Select all

declare @i int
select isnull(@i, ' ')
select isnull(@i, '')
-----------
0
(1 row(s) affected)
-----------
0
(1 row(s) affected)



Нафига вообще переводить '' или ' ' в нули потихоньку? :angry: При чем спек гласит шо должна быть ошибка.

http://msdn2.microsoft.com/en-us/library/ms187928.aspx

SQL Server returns an error message when nonnumeric char, nchar, varchar, or nvarchar data is converted to int, float, numeric, or decimal. SQL Server also returns an error when an empty string (" ") is converted to numeric or decimal.
Надоело. Самозабанен 11 ноября, 2015 - ....
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Колхозник wrote:Нафига вообще переводить '' или ' ' в нули потихоньку? :angry:


А что Вы ожидали?
Результат ISNULL должен быть определенного типа, причем этот тип определяется на стадии компиляции, а не на стадии выполнения. То есть тип результата определяется типом параметров, а не их значениями :umnik1:

Здест есть один тонкий момент, на самом деле есть раные NULL, разных типов. Есть целый NULL, есть строковый, есть юникодный, и даже разных длин. Честно честно
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
alex_127
Уже с Приветом
Posts: 7723
Joined: 29 Mar 2000 10:01
Location: Kirkland,WA

Post by alex_127 »

Колхозник wrote:SQL Server returns an error message when nonnumeric char, nchar, varchar, or nvarchar data is converted to int, float, numeric, or decimal. SQL Server also returns an error when an empty string (" ") is converted to numeric or decimal.
[/quote]

declare @i decimal
select isnull(@i, '')

Msg 8114, Level 16, State 5, Line 2
Error converting data type varchar to numeric.
User avatar
Колхозник
Уже с Приветом
Posts: 9269
Joined: 31 Jul 2003 19:17
Location: Шишконсин

Post by Колхозник »

alex_127 wrote:declare @i decimal
select isnull(@i, '')

Msg 8114, Level 16, State 5, Line 2
Error converting data type varchar to numeric.


Ну все правильно работает для только decimal and numeric (по спеку приведенному выше).

А вот это вернет 0 и никакой ошибки не выдаст:

declare @i int
select isnull(@i, ' ')

или это:

declare @i int
select coalesce(@i, ' ')

или это сконвертирует ' ' в '0':

declare @i int
select convert(varchar(50), convert(int, ' '))

или (тоже выдасть нуль)

declare @i int
select convert(varchar(50), convert(int, space(50)))

O чем я и ругаюсь (потому как этот НУЛЬ потом потихоньку конвертируется в '0' и сохраняется в строчковую колонку). Программка потихоньку конвертирует ' ' в '0', ничего нигде не рухает, никаких ошибок.

Эта фигня должна выдавать точно такую же compile-time error о несовместимости типов. :angry:
Надоело. Самозабанен 11 ноября, 2015 - ....
User avatar
Колхозник
Уже с Приветом
Posts: 9269
Joined: 31 Jul 2003 19:17
Location: Шишконсин

Post by Колхозник »

Dmitry67 wrote:
Колхозник wrote:Нафига вообще переводить '' или ' ' в нули потихоньку? :angry:


А что Вы ожидали?
Результат ISNULL должен быть определенного типа, причем этот тип определяется на стадии компиляции, а не на стадии выполнения. То есть тип результата определяется типом параметров, а не их значениями :umnik1:

Здест есть один тонкий момент, на самом деле есть раные NULL, разных типов. Есть целый NULL, есть строковый, есть юникодный, и даже разных длин. Честно честно


OK, я ж не спорю.

Я ругаюсь на то что 'а' нельзя сконвертировать в число, а результат возврата space(1000) оказывется можно без ошибки. В нуль, согласно компилятору.

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

A про NULL разных типов впервые слышу. :D
Почему это важно? Где что можно почитать?
Надоело. Самозабанен 11 ноября, 2015 - ....
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Я дам идею:

Code: Select all

select 
  convert(varchar(100),null)
  + ' '
  + convert(varchar(7),null)
  as col,
  convert(int,NULL) as intcol,
  convert(smallint,NULL) as smallintcol
  into newtab


См типы колонок newtab :)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
anmol77
Posts: 1
Joined: 26 May 2016 08:46

Re: Ошибка в SQL Server?

Post by anmol77 »

Видно же что функция ISNULL не могет несовместимые типы сама конвертировать. Блин, кто должон за вас API то читать?????
User avatar
Komissar
Уже с Приветом
Posts: 65206
Joined: 12 Jul 2002 16:38
Location: г.Москва, ул. Б. Лубянка, д.2

Re: Ошибка в SQL Server?

Post by Komissar »

это Колхозник самовозвернулся после самозабанивания?

Return to “Вопросы и новости IT”