powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нежданка от старого доброго numeric
10 сообщений из 10, страница 1 из 1
Нежданка от старого доброго numeric
    #40041111
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
--drop table #test

create table #test (
	adj varchar(80)
)

truncate table #test
insert into #test values ('-0.00004341175011369744077396948774134865') 
insert into #test values ('-0.0000434117501136974407739694877413486583702')

select 
	adj ,
	cast(adj as numeric(19,4)) as adj_typed,	
	case when cast(adj as numeric(19,4)) > 0 then '>0' 
		when cast(adj as numeric(19,4)) < 0 then '<0'
		else '0' end
from #test
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041114
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но это ладно, не беда,
Но "длинное" отрицательное мы даже обратно в варчар засунуть не можем, во как
Код: sql
1.
2.
3.
4.
5.
6.
select adj as adj_text, adj_typed,  try_cast(adj_typed as varchar(80)) as adj_for_md5
from (
	select 
		adj ,
		cast(adj as numeric(19,4)) as adj_typed			
	from #test) a


потому что
Error converting data type numeric to varchar.
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041133
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смешались в кучу кони, люди...

Чем недовольны то?

Сообщение 8115, уровень 16, состояние 6, строка 9
Ошибка арифметического переполнения при преобразовании varchar к типу данных numeric.
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041140
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Баг или фитча?
Легче конечно станет, фиксить все одно, но любопытные детали открываются о numeriс
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041147
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А... недосмотрел
у меня этой нет ошибки:
Ошибка арифметического переполнения при преобразовании varchar к типу данных numeric.

Azure Synapse Gen2
но восспроизводится и на локальном
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Developer Edition (64-bit) on Windows 10 Enterprise 10.0 <X64> (Build 18363: )

Надо понимать патчилось...
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041160
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladK,

Особо не копал, но бинарное представление получается разным (что ожидаемо)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
 cast(a.adj_typed as binary(16)) as adj_typedbin,
 cast(a.adj_typed2 as binary(16)) as adj_typedbin2,
 adj as adj_text, adj_typed,
 try_cast(adj_typed as varchar(80)) as adj_for_md5,
 try_cast(adj_typed2 as varchar(80)) as adj_for_md5__2
from (
	select 
		adj ,
		cast(adj as numeric(19,4)) as adj_typed,
		cast(cast(adj as numeric(18,4)) as numeric(19,4)) as adj_typed2
	from #test) a;
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041184
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladK
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
--drop table #test

create table #test (
	adj varchar(80)
)

truncate table #test
insert into #test values ('-0.00004341175011369744077396948774134865') 
insert into #test values ('-0.0000434117501136974407739694877413486583702')

select 
	adj ,
	cast(adj as numeric(19,4)) as adj_typed,	
	case when cast(adj as numeric(19,4)) > 0 then '>0' 
		when cast(adj as numeric(19,4)) < 0 then '<0'
		else '0' end
from #test




Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
Sep 24 2019 13:48:23
Copyright (C) 2019 Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

Ошибки нет, но нуль,- да,- ушёл в минус:
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041192
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
vladK
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
--drop table #test

create table #test (
	adj varchar(80)
)

truncate table #test
insert into #test values ('-0.00004341175011369744077396948774134865') 
insert into #test values ('-0.0000434117501136974407739694877413486583702')

select 
	adj ,
	cast(adj as numeric(19,4)) as adj_typed,	
	case when cast(adj as numeric(19,4)) > 0 then '>0' 
		when cast(adj as numeric(19,4)) < 0 then '<0'
		else '0' end
from #test




Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
Sep 24 2019 13:48:23
Copyright (C) 2019 Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

Ошибки нет, но нуль,- да,- ушёл в минус:


Наверное всё дело тут: https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-ver15

Потому что даже на '-0.00004341175011369744077396948774134865 0 ' реагирует тоже в минус ...
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041325
vladK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, что проверили, подтвердили.

Пофиксил как cast(left(ltrim(adj), 41) as numeric(19,4))
Это универсальная процедура закачки табличек из файлов, и это самое меньшее зло которое я придумал чтобы не просадить скорость (до миллиард строк в день) и не задеть сами данные (по ним хэш строится)

Но это хорошо, что в приемниках не нашлось ни одного numeric(38,38) - там терялось бы возможное округление на последнем знаке
...
Рейтинг: 0 / 0
Нежданка от старого доброго numeric
    #40041393
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladK
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 
	adj ,
	cast(adj as numeric(19,4)) as adj_typed,	
	case when cast(adj as numeric(19,4)) > 0 then '>0' 
             when cast(adj as numeric(19,4)) < 0 then '<0'
             -- про Null забыли
             else '0'
	end
from #test

...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нежданка от старого доброго numeric
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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