Рассмотрим следующие два утверждения:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Оба утверждения возвращаются -1
; не так ли это, поскольку второе двоичное значение является десятичным на 65 536 больше первого значения, не так ли?
Конечно, это не может быть связано с тихим усечением?
Если я запускаю следующие заявления:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
Мне представляется следующая ошибка:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Как я могу диагностировать, что здесь происходит?
Я запускаю это на SQL Server 2012, v11.0.5058. Результаты одинаковы для SQL Server 2008 R2 с пакетом обновления 2, SQL Server 2005 и SQL Server 2000.
sql-server
sql-server-2008
sql-server-2012
Макс Вернон
источник
источник
SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);
PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);
.Ответы:
Десятичные и целые числа по-разному кодируются в varbinary. Десятичным знакам нужно больше места. Пытаться:
Что касается вашей конечной цели, хранить целые числа как varbinary для экономии места, я думаю, что вы сами ответили на этот вопрос - не стоит.
источник