Сбой выполнения хранимой процедуры

У меня проблема с описанной ниже процедурой.

Ошибка:

Msg 402, Level 16, State 1, Procedure Get_FormattedBankStatement, Line 87. The data types nvarchar and nvarchar are incompatible in the subtract operator.

USE [K2_Objects]
GO

/****** Object:  StoredProcedure [K2RestSrv].[Get_FormattedBankStatement]   Script Date: 2/27/2019 5:00:12 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



ALTER PROCEDURE [K2RestSrv].[Get_FormattedBankStatement]
--Declaring input parameter variable
@OpeningBalance Decimal(18,2),
@jsonValue nvarchar(max)

AS

BEGIN

        DECLARE
        @TotalCount nvarchar(150),
        @MinRowNum int, @MaxRowNum int,
        @DebitRecord nvarchar(150), 
        @CreditRecord nvarchar(150),
        @NewBalance nvarchar(150),  
        @PreviousBalance nvarchar(150);


        --Creating Temp Table #GetRowID
        Create table #GetStatement
            (ID int identity(1,1),
            PostDate nvarchar(150),
            TransDate nvarchar(150),
            ValueDate nvarchar(150),
            TransID nvarchar(150),
            Narration nvarchar(max),
            Debit nvarchar(150),
            Credit nvarchar(150),
            Balance nvarchar(150));


        --Inserting into TempTable #GetStatement Temp Table, from the select statement
        INSERT INTO #GetStatement 
            (PostDate,
            TransDate,
            ValueDate,
            TransID,
            Narration,
            Debit,
            Credit,
            Balance)

        SELECT
            max(case when name='post_date' then convert(nvarchar(150),StringValue) else '' end) as [PostDate],
            max(case when name='tran_date' then convert(nvarchar(150),StringValue) else '' end) as [TranDate],
            max(case when name='value_date' then convert(nvarchar(150),StringValue) else '' end) as [ValueDate],
            max(case when name='tran_id' then convert(nvarchar(150),StringValue) else '' end) as [TransID],
            max(case when name='narration' then convert(nvarchar(150),StringValue) else '' end) as [Narration],
            max(case when name='debit' then convert(nvarchar(150),StringValue) else '' end) as [Debit],
            max(case when name='credit' then convert(nvarchar(150),StringValue) else '' end) as [Credit],
            max(case when name='balance' then convert(nvarchar(150),StringValue) else '' end) as [Balance]

        FROM parseJSON
        (
        @jsonValue
        )

        WHERE ValueType IN ('string','real','int','object','array') and Object_ID is NULL

        GROUP BY parent_ID;


        --Selecting the first and Last RowNum from the TempTable

        SET @MinRowNum = (SELECT Min(ID) FROM #GetStatement)
        SET @MaxRowNum = (SELECT Max(ID) FROM #GetStatement)
        SET @PreviousBalance = @OpeningBalance;

        WHILE @MinRowNum < @MaxRowNum

            BEGIN

                SET @DebitRecord = (SELECT Debit FROM #GetStatement WHERE ID = @MinRowNum);
                SET @CreditRecord = (SELECT Credit FROM #GetStatement WHERE ID = @MinRowNum);
                SET @NewBalance = (@PreviousBalance - (@DebitRecord + @CreditRecord));

                UPDATE #GetStatement SET Balance = @NewBalance WHERE ID = @MinRowNum;

                SET @PreviousBalance = (Select Balance from #GetStatement where ID = @MinRowNum);
                SET @MinRowNum = (@MinRowNum + 1);

            END


    Select ID, PostDate,TransDate,ValueDate,TransID,Narration,Debit,Credit,Balance from #GetStatement;



END



GO

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

Andrew Morton 28.02.2019 17:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
48
2

Ответы 2

Изменить это ЗАЯВЛЯЕТ:

@NewBalance nvarchar(150),  
@PreviousBalance nvarchar(150);

К

@NewBalance DECIMAL(10,2),  
@PreviousBalance DECIMAL(10,2);

Лучше использовать как минимум четыре знака после запятой для денежных значений, поэтому я предлагаю DECIMAL(20, 4), чтобы соответствовать использованию OP (возможно, с чрезмерным энтузиазмом) DECIMAL(18, 2).

Andrew Morton 02.03.2019 19:09

Спасибо за поддержку и обмен мнениями.

Мне удалось решить эту проблему, изменив тип данных для всех областей, где у меня было Decimal(18,2) на деньги. Переменная @OpeningBalance Decimal(18,2) была изменена на @OpeningBalance деньги.

То же самое было сделано для @DebitRecord, @CreditRecord, @NewBalance, @PreviousBalance.

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

Другие вопросы по теме