Ошибка при преобразовании типа данных varbinary к numeric

Ошибка 1С: Error converting data type varbinary to numeric

После конвертации базы на платформу 8.2 (переходили на 8.1) посыпались ошибки. Одна из них ругалась на числовые форматы:
Error converting data type varbinary to numeric

Google, к сожалению, помочь ничем конкретным не смог, отсылая к ошибкам SQL. Но все оказалось банально просто. 8.2 критично относиться к всяким вольностям. В запросе использовалось условие на булево в стиле (где Бренды — табличная часть):

ВЫБОР КОГДА &ЕстьБренды ТОГДА … 

Запрос.УстановитьПараметр(«ЕстьБренд», Бренды.Количество())

8.1 пропускала подобные параметры, без проблем конвертируя их в булево.
Проблема была решена прямым указанием типа:

Булево(Бренды.Количество())

Либо заменить условие запроса на

&ЕстьБренды >0

I’ve got a trouble with deleting/updating the particular row in my table.
The table is small and simple:

CREATE TABLE dummy 
(
    "numemv" NVARCHAR(50) NOT NULL DEFAULT NULL,
    "control_summ" DECIMAL NOT NULL DEFAULT NULL,
    "active" CHAR(1) NOT NULL DEFAULT '1',
    "departid" INT NOT NULL DEFAULT NULL,
    UNIQUE INDEX "UNIQUE" ("numemv")
)

The row that I can’t delete/update:

numemv   control_summ active departid
00499038 400000       1      0

I tried to manage in this ways:

UPDATE dbo.atm_control_summs 
SET departid = 13 
WHERE departid = 0

DELETE FROM dbo.atm_control_summs 
WHERE departid = 0

UPDATE dbo.atm_control_summs 
SET departid = 13 
WHERE numemv = '00499038'

DELETE FROM dbo.atm_control_summs 
WHERE numemv = '00499038'

But always I get the error:

Error SQL (8114): Error converting data type varbinary to numeric.

How can I fix this error?

Thanks in advance :)

  • Remove From My Forums
  • Question

  • Hi,

    I have been trying to convert binary data into decimal in SQL Server 2005 but get an error «Error converting data type varbinary to numeric».

    SELECT CONVERT(decimal(2,2), SUBSTRING(ROW_COLUMN,35,4))

    FROM TABLE

    Here ROW_COLUMN is a binary (175) column in TABLE.

    SUBSTRING(ROW_COLUMN,35,4) gives ‘0x4A230000’

    I expect the above data when converted to be returned as ‘90.34’.

    What am I doing wrong? Is there a better way to do this?

    Thanks,

    Anuja

Answers

  • This script is working:

    Code Snippet

    DECLARE @myval decimal (4, 2), @myvalue1 varbinary(8)

    SET @myval = 91.09

    —get varbinary value


    SELECT @myvalue1 = CAST(@myval AS varbinary(8))

    SELECT @myvalue1

    —get decimal value


    SELECT CONVERT(decimal(4,2), @myval)

    SELECT CONVERT(decimal(4,2), @myvalue1)

    Let us know if helpful.

Ошибка 1С: Error converting data type varbinary to numeric

После конвертации базы на платформу 8.2 (переходили на 8.1) посыпались ошибки. Одна из них ругалась на числовые форматы:
Error converting data type varbinary to numeric

Google, к сожалению, помочь ничем конкретным не смог, отсылая к ошибкам SQL. Но все оказалось банально просто. 8.2 критично относиться к всяким вольностям. В запросе использовалось условие на булево в стиле (где Бренды — табличная часть):

ВЫБОР КОГДА &ЕстьБренды ТОГДА … 

Запрос.УстановитьПараметр(«ЕстьБренд», Бренды.Количество())

8.1 пропускала подобные параметры, без проблем конвертируя их в булево.
Проблема была решена прямым указанием типа:

Булево(Бренды.Количество())

Либо заменить условие запроса на

&ЕстьБренды >0

Ошибка 1С: Error converting data type varbinary to numeric

После конвертации базы на платформу 8.2 (переходили на 8.1) посыпались ошибки. Одна из них ругалась на числовые форматы:
Error converting data type varbinary to numeric

Google, к сожалению, помочь ничем конкретным не смог, отсылая к ошибкам SQL. Но все оказалось банально просто. 8.2 критично относиться к всяким вольностям. В запросе использовалось условие на булево в стиле (где Бренды — табличная часть):

ВЫБОР КОГДА &ЕстьБренды ТОГДА … 

Запрос.УстановитьПараметр(«ЕстьБренд», Бренды.Количество())

8.1 пропускала подобные параметры, без проблем конвертируя их в булево.
Проблема была решена прямым указанием типа:

Булево(Бренды.Количество())

Либо заменить условие запроса на

&ЕстьБренды >0


Read more…

Курс по СКД (бесплатно)

В сети можно скачать  видеокурс по Системе компоновки данных для 8.2
Очень полезная вещь. Если раньше были только книги, то здесь без лишних слов описываются все тонкости и подводные камни новой СКД под 8.2.

Скачать видеокурс СКД

Ниже приведено краткое описание того, что можно полезно получить из этого курса. Но я советую лично ознакомиться с видеоматериалами. Продолжительность всего 5,5 часов.
Возле каждой полезности написан номер видеоурока вида L18


Read more…

Ошибки SQL при работе 1С

На днях столкнулся с одной ошибкой SQL. Попробовал все варианты исправления, и на уровне 1С и на уровне самого SQL, даже индексы хотел было перестроить. Но помогла банальная перезагрузка (физически) сервера.
Но по пути накопал вот этот список ошибок и их решений. В будущем может пригодиться!


Read more…

Освобождение памяти занятой сервером 1С на лету

Можно перезапустить службу 1С, но это может привести к тому, что сеансы пользователей, которые работаю с данными, завершаться аварийно.
Есть возможность перезапустить рабочие процессы сервера приложений без завершения работы пользователей. Для этого в консоли сервера выбираем процесс, который занял больше всего памяти и открываем его свойства.В свойствах процесса указываем Использование = Не использовать. Нажимаем ОК.

Все сеансы пользователей автоматически перейдут на другие рабочие процессы (сеанс Конфигуратора не переносится с процесса на процесс). Дожидаемся, пока процесс не завершится (признак Активен примет значение Нет)

После этого повторяем обратную операцию. Открываем свойство остановившегося рабочего процесса, указываем Использование = Использовать. Ждем. При первом подключении выделяется память. Память освободилась. Начинается новая жизнь.

Источник


Read more…

Перевод базы с 8.1 на 8.2

Задача стояла перевести рабочую базу на 100 пользователей (64Гб) на платформу 8.2. На момент перевода база работала на релизе 8.1.11.67 на MS SQL Server 2005. Особенность заключалась в том, что база изначально была создана со смещением дат 0. При обычной конвертации базы 1С не могла провести пересчет итогов, ругаясь на всякого рода неправильные даты (или пустые).


Read more…

Установка и настройка 1C:Предприятия 8 (вариант «клиент-сервер»)

В большинстве случаев для установки 1C:Предприятия 8.1 в варианте “клиент-сервер” достаточно запуска программы установки 1С:Предприятия 8.1. При этом сервер 1С:Предприятия получает стандартные значения параметров, необходимые для его нормального функционирования. Рассмотрим установку сервера 1С:Предприятия более детально.


Read more…

I’ve got a trouble with deleting/updating the particular row in my table.
The table is small and simple:

CREATE TABLE dummy 
(
    "numemv" NVARCHAR(50) NOT NULL DEFAULT NULL,
    "control_summ" DECIMAL NOT NULL DEFAULT NULL,
    "active" CHAR(1) NOT NULL DEFAULT '1',
    "departid" INT NOT NULL DEFAULT NULL,
    UNIQUE INDEX "UNIQUE" ("numemv")
)

The row that I can’t delete/update:

numemv   control_summ active departid
00499038 400000       1      0

I tried to manage in this ways:

UPDATE dbo.atm_control_summs 
SET departid = 13 
WHERE departid = 0

DELETE FROM dbo.atm_control_summs 
WHERE departid = 0

UPDATE dbo.atm_control_summs 
SET departid = 13 
WHERE numemv = '00499038'

DELETE FROM dbo.atm_control_summs 
WHERE numemv = '00499038'

But always I get the error:

Error SQL (8114): Error converting data type varbinary to numeric.

How can I fix this error?

Thanks in advance :)

  • Remove From My Forums
  • Question

  • Hi,

    I have been trying to convert binary data into decimal in SQL Server 2005 but get an error «Error converting data type varbinary to numeric».

    SELECT CONVERT(decimal(2,2), SUBSTRING(ROW_COLUMN,35,4))

    FROM TABLE

    Here ROW_COLUMN is a binary (175) column in TABLE.

    SUBSTRING(ROW_COLUMN,35,4) gives ‘0x4A230000’

    I expect the above data when converted to be returned as ‘90.34’.

    What am I doing wrong? Is there a better way to do this?

    Thanks,

    Anuja

Answers

  • This script is working:

    Code Snippet

    DECLARE @myval decimal (4, 2), @myvalue1 varbinary(8)

    SET @myval = 91.09

    —get varbinary value

    SELECT @myvalue1 = CAST(@myval AS varbinary(8))

    SELECT @myvalue1

    —get decimal value

    SELECT CONVERT(decimal(4,2), @myval)

    SELECT CONVERT(decimal(4,2), @myvalue1)

    Let us know if helpful.

Подниму еще раз тему про:

«Microsoft OLE DB Provider for SQL Server: Arithmetic overflow error converting numeric to data type numeric»

Просто на русскоязычных форумах практически нет нормального ответа почему получаем такое сообщение.

Вот что говрят сотрудники MS по поводу возникновения указанной ошибки, и интепретация к 1С применительно к 8.0,8.1,8.2:

В работе клиент серверной 1С иногда появляется сообщение:

Ошибка выполнения запроса

по причине:

Ошибка при выполнении операции над данными:

Microsoft OLE DB Provider for SQL Server: Arithmetic overflow error converting numeric to data type numeric.

HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1

Если данная ошибка появляется под управлением  MS SQL 2000, то рекомендуется проверить и установить обновление SP до SP4.

Но для SQL 2005 и 2008 появление такой ошибки не решается обновлением сервиспака.

Вообще появление указанной ошибки вызвано ошибкой в MS SQL при выполнении операции округления, например:

ROUND(9.5,0)

ROUND(9.6,0)

ROUND(99.5,0)

ROUND(999.5,0)

ROUND(9999.5,0)

ROUND(-9.5)

Более подробно про ошибки операции округления https://connect.microsoft.com/SQLServer/feedback/details/364387/using-round-function-with-passing-numeric-expression-to-9-5-and-length-0

. касательно 1С и запросов выполняемых в ней, указанная ошибка может появляться при выполнении команды: ВЫРАЗИТЬ(ЕСТЬNULL(ВремяПоГрафикуВЧасахНорма, 0) КАК ЧИСЛО(5, 2)) КАК WorkingHours

Если в качестве операнда будет число со значением после запятой .5, в этом случае SQL считает/разбирает значение как литерал х.5 и преобразует к данным типа Numeric(2,1). Функция ROUND (округления)  отрабытывает правильно получая округленный результат и затем пытается сохранить как данные в формате Numeric(2,1), что не правильно и мы получаем сообщение «arithmetic overflow».

Если у Вас возникает такая ошибка, то попробуете использовать преобразование:

ВЫРАЗИТЬ(ЕСТЬNULL(ВремяПоГрафикуВЧасахНорма, 0) КАК ЧИСЛО(  {НОВОЕ значение} , 2)) КАК WorkingHours

, ГДЕ

    {НОВОЕ значение} — Это увеличенное на один (несколько) разряд значение, в этом случае ошибки не будет возникать.

Всем спасибо.

Надеюсь что поможет быстро найти проблемы с ошибкой.

Разумеется. что указанная ошибка, возникнет в любом месте, где вы используете явно или нет округление.

October 7, 2012 by Muhammad Imran

I received a question from a blog reader “how to convert varbinary to numeric & vice versa & How SQL Server keeps the structure of numeric data type in varbinary format ?”

First lets take an example to convert from varbinary to numeric & vice versa”

Example :

--Convert from varbinary to numeric
Declare @varbinary2 as varbinary(max)
Set @varbinary2=0x08040001B471BC00
Select Convert(numeric(8,4),@varbinary2) as [Varbinary to Numeric]

--Convert from numeric to varbinary
Declare @Numeric2 as numeric(8,4)
Set @Numeric2 =1234.9876
Select Convert(varbinary(max),@Numeric2) as [Numeric to Varbinary]
--RESULT

Varbinary to Numeric
—————————————
1234.9876

(1 row(s) affected)

Numeric to Varbinary
—————————————
0x08040001B471BC00

(1 row(s) affected)

Explanation :
It is a simple conversion, but one thing you need to remember is, whenever you convert from varbinary to numeric, you must be exact in the Precision & Scale. If Precision & Scale are wrong, it will give you wrong result. But the question is how ascertain that the Precision & Scale are in varbinary format ?

Lets take an example from above and first get the Precision & Scale and then convert it into numeric data type.

--Convert from varbinary to numeric
Declare @varbinary1 as varbinary(max)
Set @varbinary1=0x08040001B471BC00

Select Convert(int,0x08) as [Precision]
Select Convert(int,0x04) as [Scale]

Select @varbinary1 as [Varbinary]
,Convert(numeric(18,4),@varbinary1) as [Varbinary to Numeric]
--RESULT

Precision
———–
8

(1 row(s) affected)

Scale
———–
4

(1 row(s) affected)

Varbinary | Varbinary to Numeric
———————– | —————————————
0x08040001B471BC00 | 1234.9876

(1 row(s) affected)

Given below is the screen image that will show how SQL keeps numeric data type in varbinary format.

Posted in Solutions, SQL SERVER | Tagged Data Conversion, SQL, SQL Server, SQL SERVER Convert varbinary to numeric and numeric to varbinary | 1 Comment

Понравилась статья? Поделить с друзьями:
  • Ошибка при преобразовании типа данных nvarchar к numeric
  • Ошибка при преобразовании типа данных nvarchar к int
  • Ошибка при присоединении базы данных sql
  • Ошибка при преобразовании типа данных nvarchar к float
  • Ошибка при присвоении кадастрового номера