Ошибка в SQL Server?
-
- Уже с Приветом
- Posts: 302
- Joined: 02 Nov 2001 10:01
Ошибка в SQL Server?
Посмотрите позж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().
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().
-
- Уже с Приветом
- Posts: 9269
- Joined: 31 Jul 2003 19:17
- Location: Шишконсин
Re: Ошибка в SQL Server?
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 - ....
-
- Уже с Приветом
- Posts: 302
- Joined: 02 Nov 2001 10:01
-
- Уже с Приветом
- Posts: 9269
- Joined: 31 Jul 2003 19:17
- Location: Шишконсин
-
- Уже с Приветом
- Posts: 9269
- Joined: 31 Jul 2003 19:17
- Location: Шишконсин
Справедливости ради решил тут добавить (как раз нашел баг где isnull(integer, '') исправно возвращало нули вместо пустой строчки).
Читаю в SQL 2000 спеке:
http://msdn2.microsoft.com/en-us/librar ... 210(sql.80).aspx
А работает совсем не по спеку (вроде не должно даже компилироваться) :
Читаю на SQL 2005:
http://msdn2.microsoft.com/en-us/library/ms184325.aspx
А работает по спеку (потихоньку изменяет '' на 0 ) :
Нафига вообще переводить '' или ' ' в нули потихоньку? При чем спек гласит шо должна быть ошибка.
http://msdn2.microsoft.com/en-us/library/ms187928.aspx
Читаю в 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 ) :
Code: Select all
declare @i int
select isnull(@i, ' ')
select isnull(@i, '')
-----------
0
(1 row(s) affected)
-----------
0
(1 row(s) affected)
Нафига вообще переводить '' или ' ' в нули потихоньку? При чем спек гласит шо должна быть ошибка.
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 - ....
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Колхозник wrote:Нафига вообще переводить '' или ' ' в нули потихоньку?
А что Вы ожидали?
Результат ISNULL должен быть определенного типа, причем этот тип определяется на стадии компиляции, а не на стадии выполнения. То есть тип результата определяется типом параметров, а не их значениями
Здест есть один тонкий момент, на самом деле есть раные NULL, разных типов. Есть целый NULL, есть строковый, есть юникодный, и даже разных длин. Честно честно
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
-
- Уже с Приветом
- Posts: 7723
- Joined: 29 Mar 2000 10:01
- Location: Kirkland,WA
[/quote]Колхозник 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.
declare @i decimal
select isnull(@i, '')
Msg 8114, Level 16, State 5, Line 2
Error converting data type varchar to numeric.
-
- Уже с Приветом
- Posts: 9269
- Joined: 31 Jul 2003 19:17
- Location: Шишконсин
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 о несовместимости типов.
Надоело. Самозабанен 11 ноября, 2015 - ....
-
- Уже с Приветом
- Posts: 9269
- Joined: 31 Jul 2003 19:17
- Location: Шишконсин
Dmitry67 wrote:Колхозник wrote:Нафига вообще переводить '' или ' ' в нули потихоньку?
А что Вы ожидали?
Результат ISNULL должен быть определенного типа, причем этот тип определяется на стадии компиляции, а не на стадии выполнения. То есть тип результата определяется типом параметров, а не их значениями
Здест есть один тонкий момент, на самом деле есть раные NULL, разных типов. Есть целый NULL, есть строковый, есть юникодный, и даже разных длин. Честно честно
OK, я ж не спорю.
Я ругаюсь на то что 'а' нельзя сконвертировать в число, а результат возврата space(1000) оказывется можно без ошибки. В нуль, согласно компилятору.
Мало того в спеке SQL 2000 (выше), обещано что такой код должон рухать при компиляции (типы параметров должны быть те же). А не фига не рухает.
A про NULL разных типов впервые слышу.
Почему это важно? Где что можно почитать?
Надоело. Самозабанен 11 ноября, 2015 - ....
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
Я дам идею:
См типы колонок newtab
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
-
- Posts: 1
- Joined: 26 May 2016 08:46
Re: Ошибка в SQL Server?
Видно же что функция ISNULL не могет несовместимые типы сама конвертировать. Блин, кто должон за вас API то читать?????
-
- Уже с Приветом
- Posts: 64875
- Joined: 12 Jul 2002 16:38
- Location: г.Москва, ул. Б. Лубянка, д.2
Re: Ошибка в SQL Server?
это Колхозник самовозвернулся после самозабанивания?