У меня проблема с описанной ниже процедурой.
Ошибка:
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





Изменить это ЗАЯВЛЯЕТ:
@NewBalance nvarchar(150),
@PreviousBalance nvarchar(150);
К
@NewBalance DECIMAL(10,2),
@PreviousBalance DECIMAL(10,2);
Лучше использовать как минимум четыре знака после запятой для денежных значений, поэтому я предлагаю DECIMAL(20, 4), чтобы соответствовать использованию OP (возможно, с чрезмерным энтузиазмом) DECIMAL(18, 2).
Спасибо за поддержку и обмен мнениями.
Мне удалось решить эту проблему, изменив тип данных для всех областей, где у меня было Decimal(18,2) на деньги. Переменная @OpeningBalance Decimal(18,2) была изменена на @OpeningBalance деньги.
То же самое было сделано для @DebitRecord, @CreditRecord, @NewBalance, @PreviousBalance.
Точно так же «Объединение» использовалось для расчета нового баланса путем объединения Предыдущего Баланса, Кредитной записи и Дебитовой записи.
Почему числа хранятся в виде строк? Это вызовет только проблемы, как вы обнаружите.