Ошибка арифметического переполнения при преобразовании expression к типу данных nvarchar

I am creating a helpdesk system but seem to of run into a slight problem, when the user clicks a button to «pre register» the helpdesk ticket number, my script fires off to the SQL Express server, creating a new row -> gets the row ID -> Uses the row ID to create the final ticket ref (in the format of RAD000001 for example for row 1) this process seems to work for me fine, until i get to number 9… when the user clicks the «create new Ticket ref» button(Generating ticket number 10) i get the following error:

Arithmetic overflow error converting expression to data type nvarchar.

It creates the row, but seems to fail on the update(the row is created, the ID returned and then the ref created from the ID)

My SQL table is looks like this:

CREATE TABLE [dbo].[tickets](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [ticket_ref] [varchar](15) NULL,
    [details_id] [int] NULL,
    [state] [int] NULL,
    [create_date_Time] [datetime] NOT NULL,
    [details_subject] [varchar](255) NULL,
    [details_main_body] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

and this is the c# code behind:

private string Reform_TicketId(string original_ticket_id)
{
    switch (original_ticket_id.Length)
    {
        case 1:
            return "RAD00000" + original_ticket_id.ToString();
        case 2:
            return "RAD0000" + original_ticket_id.ToString();
        case 3:
            return "RAD000" + original_ticket_id.ToString();
        case 4:
            return "RAD00" + original_ticket_id.ToString();
        case 5:
            return "RAD0" + original_ticket_id.ToString();
        case 6:
            return "RAD" + original_ticket_id.ToString();
        default:
            return "ERROR!";
    }
}

protected void DsCreateTicketEntry_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
    string original_id = e.Command.Parameters["@ticket_id"].Value.ToString();
    string reformed_id = Reform_TicketId(original_id.ToString()).ToString();

    if (original_id != "0")
    {
        //It has returned a value that is a DB ID field and seems correct! lets proceed!
        DsCreateTicketEntry.UpdateParameters["ticket_db_id"].DefaultValue = original_id;
        //DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = reformed_id;
        DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = "RAD000002";
        DsCreateTicketEntry.Update();
        LblTicketOutput.Text = reformed_id;
    }
    else
    {
        //@TODO: Write to the label stating we had problems generating a Ticket ID!
    }
}

protected void btnCreateTicket_Click(object sender, EventArgs e)
{
    DsCreateTicketEntry.Insert();
    btnCreateTicket.Enabled = false;
}

with the following queries in my SQLDataSource:

InsertCommand="INSERT INTO tickets(state, create_date_Time) VALUES (1,GETDATE()) SET @ticket_id=SCOPE_IDENTITY();"    
UpdateCommand="UPDATE tickets SET ticket_ref = @new_ticket_id WHERE (id = @ticket_db_id)"

Hopfully someone is able to cast some light on where i am going wrong!? I have been looking at this code all day, and its fallen slightly outside my league of learning…

Может довольно простой вопрос.
Но хотелось бы узнать механизм работы.
Почему

SELECT 2000000000 * 3 
--Ошибка арифметического переполнения при преобразовании expression к типу данных int.

SELECT 3000000000 * 3  
-- 9000000000

Если создать вью

create view ts
as 

SELECT 2000000000 * 3 AS A, 3000000000 * 3  AS B

, то в типах данных увидим такое
5b6ac47caf1c0980349547.jpeg

Я создаю систему службы поддержки, но, похоже, столкнулся с небольшой проблемой: когда пользователь нажимает кнопку, чтобы «предварительно зарегистрировать» номер билета службы поддержки, мой скрипт срабатывает на сервере SQL Express, создавая новую строку -> получает идентификатор строки -> использует идентификатор строки для создания окончательной ссылки на билет (в формате RAD000001, например, для строки 1), этот процесс, кажется, работает для меня нормально, пока я не доберусь до номера 9… когда пользователь нажимает » Кнопка «создать новый билет» (создание билета номер 10) я получаю следующую ошибку:

Arithmetic overflow error converting expression to data type nvarchar.

Он создает строку, но, похоже, не работает при обновлении (строка создается, возвращается идентификатор, а затем ссылка создается из идентификатора)

Моя таблица SQL выглядит так:

CREATE TABLE [dbo].[tickets](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [ticket_ref] [varchar](15) NULL,
    [details_id] [int] NULL,
    [state] [int] NULL,
    [create_date_Time] [datetime] NOT NULL,
    [details_subject] [varchar](255) NULL,
    [details_main_body] [text] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

и это код С#:

private string Reform_TicketId(string original_ticket_id)
{
    switch (original_ticket_id.Length)
    {
        case 1:
            return "RAD00000" + original_ticket_id.ToString();
        case 2:
            return "RAD0000" + original_ticket_id.ToString();
        case 3:
            return "RAD000" + original_ticket_id.ToString();
        case 4:
            return "RAD00" + original_ticket_id.ToString();
        case 5:
            return "RAD0" + original_ticket_id.ToString();
        case 6:
            return "RAD" + original_ticket_id.ToString();
        default:
            return "ERROR!";
    }
}

protected void DsCreateTicketEntry_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
    string original_id = e.Command.Parameters["@ticket_id"].Value.ToString();
    string reformed_id = Reform_TicketId(original_id.ToString()).ToString();

    if (original_id != "0")
    {
        //It has returned a value that is a DB ID field and seems correct! lets proceed!
        DsCreateTicketEntry.UpdateParameters["ticket_db_id"].DefaultValue = original_id;
        //DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = reformed_id;
        DsCreateTicketEntry.UpdateParameters["new_ticket_id"].DefaultValue = "RAD000002";
        DsCreateTicketEntry.Update();
        LblTicketOutput.Text = reformed_id;
    }
    else
    {
        //@TODO: Write to the label stating we had problems generating a Ticket ID!
    }
}

protected void btnCreateTicket_Click(object sender, EventArgs e)
{
    DsCreateTicketEntry.Insert();
    btnCreateTicket.Enabled = false;
}

со следующими запросами в моем SQLDataSource:

InsertCommand="INSERT INTO tickets(state, create_date_Time) VALUES (1,GETDATE()) SET @ticket_id=SCOPE_IDENTITY();"    
UpdateCommand="UPDATE tickets SET ticket_ref = @new_ticket_id WHERE (id = @ticket_db_id)"

Надеюсь, кто-то сможет пролить свет на то, где я ошибаюсь!? Я смотрел на этот код весь день, и он немного вышел за рамки моей лиги обучения…

Я получаю данные из представления, и один из столбцов, которые я использую, — nvarchar(50), но всегда только N'True' или N'False', в зависимости от работы связанного столбца даты в этом родительском представлении.

Следующий код извлекает идентификатор записи и столбец, который я ищу, YTD:

SELECT Enquiry_Number, YTD 
FROM dbo.vw_SalesPO_YTD

Выход:

ENQ-001 True
ENQ-002 False
ENQ-003 True

Однако по какой-то причине я не могу фильтровать свои результаты с помощью этого столбца YTD. Если я попытаюсь сделать это:

SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD
WHERE YTD = N'True'

Затем происходит сбой со следующей ошибкой:

Ошибка арифметического переполнения при преобразовании выражения в тип данных datetime.

Этого я не понимаю, потому что в этом запросе нет выражений datetime. Да, True или False были определены путем сравнения дат и времени в родительском представлении, но я не понимаю, как это могло попасть в этот подзапрос. Попытка сделать то же самое в родительском представлении дает ту же ошибку — я демонстрирую это таким образом для простоты.

Однако выполнение аналогичной операции в части запроса SELECT работает без проблем:

SELECT 
    Enquiry_Number,
    YTD,
    CASE 
       WHEN YTD = N'True' THEN 1 ELSE 0 
    END As C
FROM
    dbo.vw_SalesPO_YTD 

Выход:

ENQ-001 True 1
ENQ-002 False 0
ENQ-003 True 1

Однако эти 1 и 0 наследуют один и тот же недостаток, поэтому я не могу использовать их в предложении WHERE без этой ошибки datetime.

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

Когда я проверил YTD в INFORMATION_SCHEMA.COLUMNS, это подтверждает, что этот столбец ничем не отличается от других столбцов в моей таблице: YTD равен nvarchar(50), используя {{X4} } сопоставление.

Связанный вопрос: Выражение преобразования ошибки арифметического переполнения SQL Server к типу данных datetime


Источник проблемы

Эта проблема все еще не решена, но если вы хотите воспроизвести ее, этот код из родительского представления должен генерировать эту проблему:

CASE WHEN 
Award_Date <= DATEFROMPARTS(FinancialYear - 1, 11, 1) + GETDATE() - DATEADD(year, DATEDIFF(month, '20161101', GETDATE()) / 12, '20161101')
THEN N'True'
ELSE N'False'
END

Да, это выглядит слишком сложно. Мы сравниваем Award_Date с связанным FinancialYear, который длится с 1 ноября по 31 октября. Каждая запись уже знает, в каком FinancialYear она находится. Конечная цель состоит в том, чтобы сравнить позицию СЕГОДНЯ (30.11.2016) с СЕГОДНЯМИ в прошлом году (2015-11-30) и СЕГОДНЯ годом ранее (2014-11- 30) и др.

Таким образом, код берет сегодняшнюю дату и объединяет ее с FinancialYear для связанной записи и показывает, произошла ли запись между началом финансового года и сегодня того же года. . И он делает это успешно, но тогда я ничего не могу сделать с N'True' или N'False', которые он производит.

5 ответов

Лучший ответ

Это успешный обходной путь , а не решение как таковое или объяснение основной проблемы.

Очевидно, что существует проблема с данными, поступающими из представления, которая не позволяет обрабатывать результаты столбца YTD в предложении WHERE, и тем не менее, они могут быть обработаны к тому времени, когда запрос достигнет его SELECT фаза.

Я создал новый table, который явно определяет столбец YTD как nvarchar(50), а затем вставил все записи из моего представления в эту таблицу, что устранило проблему. Затем записи можно отсортировать и отфильтровать по YTD, как и положено.


0

Steve Taylor
30 Ноя 2016 в 14:02

SELECT *
FROM (SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD) AS A
WHERE cast(A.YTD as varchar) = 'True'


1

Krish
30 Ноя 2016 в 12:45

В качестве примера я использовал следующее:

DECLARE @Data TABLE
(
    Enquiry_Number nvarchar(10),
    YTD nvarchar(50)
)

INSERT INTO @Data(Enquiry_Number, YTD)
SELECT N'ENQ-001', N'True' UNION
SELECT N'ENQ-002', N'False' UNION
SELECT N'ENQ-003', N'True' 


SELECT Enquiry_Number, [YTD] FROM (
    SELECT Enquiry_Number, CONVERT(nvarchar(10),YTD) AS [YTD] FROM @Data
) AS A
WHERE A.YTD = N'True'

Результат:

ENQ-001 True
ENQ-003 True

В поле YTD должны быть результаты, которые заставят его вернуть как тип datetime.

Попробуйте такой запрос:

SELECT * FROM dbo.vw_SalesPO_YTD WHERE ISDATE(YTD)= 1

Обновленный вопрос: попробуйте:

ISNULL(CASE WHEN  Award_Date <= DATEFROMPARTS(FinancialYear - 1, 11, 1) + GETDATE() - DATEADD(year, DATEDIFF(month, '20161101', GETDATE()) / 12, '20161101') THEN N'True' ELSE N'False' END, 'false')


1

Danie Schoeman
30 Ноя 2016 в 13:38

Попробуйте это: — Не добавляйте n перед строкой

SELECT *
FROM (SELECT Enquiry_Number, YTD
FROM dbo.vw_SalesPO_YTD) AS A
WHERE A.YTD = 'True'


1

frhd
30 Ноя 2016 в 14:21

Я не знаю, что это за тип источника с начала года.

Попробуйте использовать следующее:

SELECT Enquiry_Number, [YTD] FROM (
    SELECT Enquiry_Number, CONVERT(nvarchar(10),YTD) AS [YTD] FROM dbo.vw_SalesPO_YTD
) AS A
WHERE A.YTD = N'True'

10 — это просто отстойное значение. Он будет вырезать любую часть поля длиной более 10. Это зависит от вашего фактического размера поля.


1

Danie Schoeman
30 Ноя 2016 в 12:35

  

фпк1сл

31.01.16 — 21:52

Добрый день!

Конфигурация УТ 11.1.10.145, платформа 8.3.6.2237, SQL Server 2008.

При проведении документа «Расчет себестоимости товаров» за апрель, выскакивает ошибка

Ошибка при выполнении обработчика — ‘ОбработкаПроведения’

по причине:

{Документ.РасчетСебестоимостиТоваров.МодульОбъекта(2181)}: Ошибка при вызове метода контекста (ВыполнитьПакет)

        Выборка = Запрос.ВыполнитьПакет()[1].Выбрать();

по причине:

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

по причине:

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

Microsoft SQL Server Native Client 10.0: Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric.

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

Все  другие документы проводятся нормально. Подскажите пожалуйста, все чем может быть проблема, куда смотреть?

  

фпк1сл

1 — 31.01.16 — 21:53

Я понимаю, что где-то в результате запроса получается большое число, вот только как найти, откуда это число возникает?

  

cw014

2 — 01.02.16 — 07:37

Пройтись отладчиком + ТИИ

  

фпк1сл

3 — 01.02.16 — 11:57

Отладчик мне ничего не покажет, программа завершается в момент Выборка = Запрос.ВыполнитьПакет()[1].Выбрать(); , значит я не узнаю, что её выбивает. В файловом варианте база тоже не запускается, размер слишком большой.

  

Timon1405

4 — 01.02.16 — 12:04

обновитесь, говорят, на 11.1.10.150 проблема уходит.

  

Михаил Козлов

5 — 01.02.16 — 12:14

(3) Можно попробовать в консоли удалять из пакета по 1. Или выполнять по 1.

  

Карупян

6 — 01.02.16 — 12:16

профайлером (или тж) засечь запрос и посмотреть

  

фпк1сл

7 — 01.02.16 — 15:21

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

  

фпк1сл

8 — 02.02.16 — 16:16

Обновление не дало результатов. В ТЖ и профайлер смотрел — ничего не понял. Подскажите, может по какому нибудь регистру посмотреть какие нибудь значения подозрительные?

  

mikecool

9 — 02.02.16 — 16:19

(8) первый запрос из пакета генерит не перевариваемое число — посмотри, какие там числовые поля и попытайся понять, откуда мб такое большое

  

Timon1405

10 — 02.02.16 — 17:16

(8) поищите большой ресурс «ПостояннаяРазница» в регистре ВыручкаИСебестоимостьПродаж в консоли запросов

  

Tateossian

11 — 02.02.16 — 18:37

(0) Скорее всего, это происходит где-то при делении, попробуй все такие места явно обработать через ВЫРАЗИТЬ( КАК ЧИСЛО(xx,yy))

  

Cyberhawk

12 — 02.02.16 — 18:53

ИР тебе в помощь — там и разбивка запроса на подзапросы, и отбор ТЖ по конкретному запросу

  

фпк1сл

13 — 03.02.16 — 09:26

(11) В том то дело, все место обработаны через Выразить, запрос полностью типовой.

// 0 Расчет коэффициентов (количество перехода из состояния в состояние) уравнения.

        |ВЫБРАТЬ

        |    УзлыКорректировки.НомерУзла                                     КАК НомерУзла,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.Стоимость)                  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициент,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьБезНДС)            КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентБезНДС,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ПостояннаяРазница)          КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентПостояннаяРазница,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ВременнаяРазница)           КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентВременнаяРазница,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходы)        КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходы,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходыБезНДС)  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходыБезНДС,

        |

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК Стоимость,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьБезНДС,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК ПостояннаяРазница,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ВременнаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК ВременнаяРазница,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходы, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьДопРасходы,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходыБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьДопРасходыБезНДС

        |

        |ПОМЕСТИТЬ ВременнаяТаблицаРешений

        |ИЗ

        |    ВтУзлыКорректировки КАК УзлыКорректировки

        |    ЛЕВОЕ СОЕДИНЕНИЕ ВтПеремещенияСписания КАК ПеремещенияСписания

        |        ПО УзлыКорректировки.НомерУзла = ПеремещенияСписания.НомерУзлаПриемник

        |    ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ВтТаблицаРешений

        |        ПО ПеремещенияСписания.НомерУзлаИсточник = ВтТаблицаРешений.НомерУзла

        |ГДЕ

        |    УзлыКорректировки.Количество <> 0

        |    И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) > -999999999.999999999

        |    И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) < 999999999.999999999

        |

        |СГРУППИРОВАТЬ ПО

        |    УзлыКорректировки.НомерУзла,

        |    УзлыКорректировки.Количество

        |

        |ИНДЕКСИРОВАТЬ ПО

        |    НомерУзла

        |;

        |/////////////////////////////////////////////////////////////////////////////

        // 1 Расчет ошибки расчета.

        |ВЫБРАТЬ

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК Отклонение,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеБезНДС,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеПостояннаяРазница,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеВременнаяРазница,

        |

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА

        |

        |                ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеДопрасходы,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА

        |

        |                ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеДопрасходыБезНДС

        |ИЗ

        |    ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений

        |

        |        ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ТаблицаРешений

        |        ПО ВременнаяТаблицаРешений.НомерУзла = ТаблицаРешений.НомерУзла

        |;

        |//////////////////////////////////////////////////////////////

        // 2 Удаление таблиц.

        |УНИЧТОЖИТЬ ВтТаблицаРешений

        |;

        // 3 Суммирование коэффициентов.

        |//////////////////////////////////////////////////////////////

        |ВЫБРАТЬ

        |    ВременнаяТаблицаРешений.НомерУзла  КАК НомерУзла,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициент

        |            + ВременнаяТаблицаРешений.Стоимость

        |        КАК ЧИСЛО(23,10))              КАК Стоимость,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |            + ВременнаяТаблицаРешений.СтоимостьБезНДС

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьБезНДС,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |            + ВременнаяТаблицаРешений.ПостояннаяРазница

        |        КАК ЧИСЛО(23,10))              КАК ПостояннаяРазница,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |            + ВременнаяТаблицаРешений.ВременнаяРазница

        |        КАК ЧИСЛО(23,10))              КАК ВременнаяРазница,

        |

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |            + ВременнаяТаблицаРешений.СтоимостьДопРасходы

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьДопРасходы,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходыБезНДС

        |            + ВременнаяТаблицаРешений.СтоимостьДопРасходыБезНДС

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьДопРасходыБезНДС

        |

        |ПОМЕСТИТЬ ВтТаблицаРешений

        |

        |ИЗ

        |    ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений

        |

        |ИНДЕКСИРОВАТЬ ПО

        |    НомерУзла

        |;

        |//////////////////////////////////////////////////////////////

        // 4 Удаление таблицы.

        |    УНИЧТОЖИТЬ ВременнаяТаблицаРешений

        |»;

  

фпк1сл

14 — 03.02.16 — 12:58

Запрос выполняется с использованием Менеджера временных таблиц

  

фпк1сл

15 — 03.02.16 — 13:02

Еще глупый вопрос, в запросе выполняется первый пакет. Как мне его найти?

  

фпк1сл

16 — 05.02.16 — 09:26

я вычислил, что всему виной вот эта строчка в запросе

|    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

Здесь и происходит переполнение.

  

Ёпрст

17 — 05.02.16 — 09:35

(16) выкини выразить оттуда

  

Ёпрст

18 — 05.02.16 — 09:35

и спи спокойно дальше

  

фпк1сл

19 — 05.02.16 — 09:42

(17) Не помогло, все та же ошибка преобразования numeric.

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

  

Ёпрст

20 — 05.02.16 — 09:43

ну поставь  КАК ЧИСЛО(15,0)

  

фпк1сл

21 — 05.02.16 — 09:53

(20) Все так же упрямо выскакивает эта ошибка.

  

НЕА123

22 — 05.02.16 — 10:00

СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0)) Как СуммаПР,

Сумма(ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК СуммаСписания,…

может дикие числа.

  

НЕА123

23 — 05.02.16 — 10:03

вообще, ИМХО, ВЫРАЗИТЬ в Сумма засунуть.

  

Tateossian

24 — 05.02.16 — 10:09

(16) Выведи в отладке содержимое ВтТаблицаРешений в ТЗ и посмотри, что там за числа.

  

фпк1сл

25 — 05.02.16 — 10:53

(23) выразил, снова ошибка. (24)  Глазами пробежался по 12к строк, на первый взгляд никакого криминала. Попробую покромсать запрос и выполнять по частям.

  

фпк1сл

26 — 05.02.16 — 13:11

Получается, что «ВтТаблицаРешений.ПостояннаяРазница» и «ПеремещенияСписания.Количество» имеют значение Null.

И если подставить, то получается, что выражение

ВЫРАЗИТЬ(СУММА(0 * 0) КАК ЧИСЛО(23,10)) — вызывает арифметическое переполнение.

  

фпк1сл

27 — 05.02.16 — 13:50

Был неправ, зайдя дальше обнаружил, что умножение «ВтТаблицаРешений.ПостояннаяРазница» и «ПеремещенияСписания.Количество» на какой то итерации дает переполнение, буду двигаться дальше.

  

фпк1сл

28 — 09.02.16 — 15:52

При проведении документа «Расчет себестоимости» формируются записи регистра накопления «Себестоимость товаров». Так вот за 2014 год все формировалось нормально, а с 2015 в колонке «Стоимость (ПР)» — постоянная разница, только по 2-3 номенклатурам начали появляться и расти огромные числа. Подскажите, из-за чего растет постоянная разница строго по 2 позициям номенклатуры?

  

фпк1сл

29 — 10.02.16 — 10:10

Пример. Одна организация, два склада.

Документ перемещения формирует две записи в регистре накопления — Количество(10) по двум складам.

Документ Расчет себестоимости товаров формирует одну запись — Стоимость(ПР) : 134 046 229,30.   Откуда такая цифра? Причем некоторые записи идут корректно, в чем разница, так и не понял.

SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Enterprise — duplicate (do not use) SQL Server 2014 Developer — duplicate (do not use) SQL Server 2014 Standard — duplicate (do not use) SQL Server 2014 Web — duplicate (do not use) Еще…Меньше

Проблемы

Предположим, что вы используете репликацию транзакций Microsoft SQL Server 2012 или SQL Server 2014. Вы пытаетесь добавить подписку с @sync_type, указанную как «поддержка репликации», «Инициализация с помощью резервной копии» или «инициализировать из LSN» для публикации, а идентификатор публикации больше 99. В этом случае появляется следующее сообщение об ошибке:

Сообщение 8115, уровень 16, состояние 2, sp_MSsetupnosyncsubscriptionwithlsn процедуры, строка 237Arithmetic ошибка переполнения при преобразовании выражения в тип данных nvarchar.

Решение

Совокупные сведения об обновлениях

Эта проблема впервые устранена в следующем накопительном обновлении SQL Server.

  • Накопительное обновление 1 для SQL Server 2014 с пакетом обновления 1 (SP1)

  • Накопительное обновление 5 для SQL Server 2012 с пакетом обновления 2 (SP2)

  • Накопительное обновление 6 для SQL Server 2014

  • Накопительное обновление 14 для SQL Server 2012 с пакетом обновления 1 (SP1)

Статус

Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе «Применяется к».

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

Создал представление, содержащее следующий запрос:

SELECT TOP (100) PERCENT dbo.заявки_рас.ДатаПоступления + dbo.заявки_рас.ВремяПоступления AS datetime_add, dbo.дома.УК AS uk, 
               dbo.заявки_рас.ВидРабот AS type_work
FROM  dbo.дома INNER JOIN
               dbo.заявки_рас ON dbo.дома.АдресДома = dbo.заявки_рас.АдресДома
WHERE (dbo.заявки_рас.ОтметкаУдалить = 0) AND (dbo.заявки_рас.ЗаявкаВыполнена = 1) OR
               (dbo.заявки_рас.ОтметкаУдалить IS NULL)
ORDER BY datetime_add

И в результате получаю ошибку, упомянутую в сабже. В mssql разбираюсь плохо, подскажите где искать проблему? Индексов в таблице «заявки_рас» нету (сначала думал из за них, тк все началось после операций с пересозданием индекса).
Если убрать

dbo.заявки_рас.ДатаПоступления + dbo.заявки_рас.ВремяПоступления AS datetime_add,

…то вроде работает, но для правильного результата необходимо всетаки сложить эти два времени.

задан 16 сен 2011 в 11:02

Roman St's user avatar

0

Скорее всего, это связано с тем, что у вас колонки dbo.заявки_рас.ВремяПоступления и dbo.заявки_рас.ДатаПоступления имеют тип smalldatetime. Чтобы не было такой ошибки, нужно привести данные к типу datetime.

Но меня немного смущает метод сложения дат.

Пример. Дата 2007-05-08 12:35:00 + дата ‘2007-05-08 14:35:00 выдаст 2114-09-13 03:10:00.000, то есть складываются все составляющие дат.

Возможно, тут лучше использовать datediff метод.

Nicolas Chabanovsky's user avatar

ответ дан 16 сен 2011 в 12:46

joyecoder's user avatar

3

  • Ошибка арифметического переполнения при преобразовании expression к типу данных int mssql
  • Ошибка арифметического переполнения при преобразовании expression к типу данных datetime
  • Ошибка арифметического переполнения при преобразовании expression к типу данных bigint
  • Ошибка аристон духовой шкаф f5e2
  • Ошибка аристон sp1 на котле что значит