Не удалось преобразовать напрямую в десятичное значение? - PullRequest
9 голосов
/ 01 апреля 2019

У меня есть следующая строка, и я хочу преобразовать ее в DECIMAL(38,0):

a321

Следующий код в порядке:

SELECT CAST(CONVERT(binary(2), 'a321', 2) AS BIGINT);  -- 41761

, но эта ошибка:

SELECT CAST(CONVERT(binary(2), 'a321', 2) AS DECIMAL(38,0));

Сообщение 8114, уровень 16, состояние 5, строка 7 Ошибка при преобразовании типа данных varbinary в числовой тип.

Ничего страшного в том, чтобы выполнить два приведения типа, как это:

SELECT CAST(CAST(CONVERT(binary(2), 'a321', 2) AS BIGINT) AS DECIMAL(38,0));

но я хочу знать, почему не работает.Кто-нибудь может объяснить?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2019

Сначала преобразуйте в bigint, а затем в десятичное:

SELECT CONVERT(DECIMAL(38, 0), CONVERT(BIGINT, CONVERT(binary(2), 'a321', 2)))

Двоичное представление десятичных чисел сильно отличается от целых чисел, и не все двоичные представления могут быть преобразованы в десятичное.

1 голос
/ 02 апреля 2019

Это может быть связано с тем, что число, которое вы пытаетесь преобразовать, представляет собой целое число , а не десятичное число .

SELECT CAST(41761 AS VARBINARY), CAST(41761.0 as VARBINARY)

Приведенные выше результаты дают другие результаты, поскольку яподозреваю, что последний несет информацию о десятичной составляющей.Аналогично, при преобразовании десятичного значения в двоичное, оно работает как положено.

SELECT CAST(41761.0 as VARBINARY) -- gives 0x060100014A5F0600 on Azure SQL
SELECT CAST(0x060100014A5F0600 as DECIMAL) -- gives 41761 on Azure SQL

Я пометил сервер как MSDN утверждает, что результаты могут сильно различаться между версиями.

Не создавайте двоичные значения, а затем преобразовывайте их в тип данных категории числовых типов данных.SQL Server не гарантирует, что результат преобразования десятичного или числового типа данных в двоичный будет одинаковым в разных версиях SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...