无法插入空值 - 变量数据未存储在变量中

Cannot Insert Null Values - Variable data not being stored in variables

我创建了一个存储过程,它将 运行 作为一项工作,但我收到一个错误,提示我无法插入空值,尽管我正在为我的设置值在我的更新 table 语句中使用它的变量。当我尝试打印输出语句时,它没有被打印出来。你能帮我解决这个问题吗?

CREATE PROCEDURE [ABC].[RUN_PROCESS]
    (@JOBRUN_ID INT, @DATE DATE = NULL)
AS
BEGIN TRY
    DECLARE @StartDateTime  DATETIME = GETDATE()
    DECLARE @EndDateTime    DATETIME
    DECLARE @JobName        CHAR(6) = 'RUNPRO'
    DECLARE @JobID          INT = 100
    DECLARE @TaskID         INT
    DECLARE @TableID        INT
    DECLARE @Output         VARCHAR(2000)
    DECLARE @FailedCount    INT = 0
    DECLARE @TotalRecords   INT
    DECLARE @StudentID      INT
    DECLARE @TotalAmount    VARCHAR(100)
    DECLARE @UpdatedRecords INT
    DECLARE @Log2Entry      INT

    IF @DATE IS NULL
        SET @DATE = GETDATE()

    PRINT @DATE;

    -- Update entry in table [ABC].[LOG1_Table] with Status P
    UPDATE ABC.LOG1_Table 
    SET Status = 'P' 
    WHERE JobRunID = @JOBRUN_ID;
    
    -- Inserting a Log Entry in [ABC].[LOG2_Table]
    INSERT INTO ABC.LOG1_Table 
    VALUES (@JobID, @StartDateTime, @JobName, FORMAT(@StartDateTime, 'HH:mm'), '',NULL, 'A');
    
    SET @Log2Entry = SCOPE_IDENTITY();
    
    SELECT @TotalRecords = COUNT(PaymentID) 
    FROM ABC.Student_Payments 
    WHERE Status <> 'X' AND PaymentDate = @Date;

    PRINT 'Total Payments to be Updated: '+ CAST(@TotalRecords AS VARCHAR(20));

    SELECT @TotalAmount = CONVERT(VARCHAR(100), CAST(SUM(Charges + SalesTax) AS MONEY), 1) 
    FROM ABC.Student_Payments 
    WHERE Status <> 'X' AND PaymentDate = @Date;
    
    PRINT 'Total Amount: '+ @TotalAmount
    
    BEGIN TRANSACTION
        UPDATE ABC.Student_Payments 
        SET DateReceived = GETDATE() 
        OUTPUT @JOBRUN_ID, inserted.PaymentID, 'Payment Received', GETDATE(), 'D' INTO ABC.LOG3_TABLE
        WHERE Status <> 'X' AND PaymentDate = @Date
        
        SET @UpdatedRecords = @@ROWCOUNT
        
        PRINT 'Total Payments Updated: '+ CAST(@UpdatedRecords AS VARCHAR(20));

        SELECT @Output = 'RUNPRO: Updated' + CAST(@UpdatedRecords AS VARCHAR(20)) + ' records for $' + @TotalAmount;

        PRINT (@Output);
        
        IF(@TotalRecords = @LockedRecords)
        BEGIN
            UPDATE ABC.LOG1_Table 
            SET OutputLog = @Output, 
                EndDateTime = @EndDateTime, 
                RunTime = CONVERT(decimal(7, 2), DATEDIFF(SECOND, @StartDateTime, @EndDateTime)),  
                Status = 'C' 
            WHERE JobRunID = @JOBRUN_ID;
        
            UPDATE ABC.LOG2_Table 
            SET Remarks = @Output, 
                EndDateTime = @EndDateTime, 
                Status = 'C' 
            WHERE Log2Entry = @Log2Entry;           
        END
        ELSE
            RAISERROR('The Total Record Count and Locked Record Count Do not Match',12,100) 

    COMMIT TRANSACTION; 
        
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
   
    SELECT @EndDateTime = GETDATE();
    
    UPDATE ABC.LOG1_Table 
    SET OutputLog = ERROR_MESSAGE(), 
        EndDateTime = @EndDateTime, 
        RunTime = CONVERT(decimal(7, 2), DATEDIFF(SECOND, @StartDateTime, @EndDateTime)),  
        Status = 'E'  
    WHERE JobRunID = @JOBRUN_ID;
    
    UPDATE ABC.LOG2_Table  
    SET Remarks = ERROR_MESSAGE(), 
        EndDateTime = @EndDateTime, 
        Status = 'E' 
    WHERE Log2Entry = @Log2Entry;

END CATCH

我认为问题在于“Charges”字段或“SalesTax”字段可能允许空值。如果是这样,请更新此行:

SELECT @TotalAmount = CONVERT(VARCHAR(100), CAST(SUM(Charges + SalesTax) AS MONEY), 1) 

收件人:

SELECT @TotalAmount = CONVERT(VARCHAR(100), CAST(isnull(SUM(Charges + SalesTax), 0) AS MONEY), 1)

所以你不会有 NULL 值,它会工作正常。

您应该在 INSERT 语句中指定字段。

这很可能是问题所在, 如果您遇到无法插入空值的错误。

我看到目前 INSERT 语句没有指定字段 (来自您粘贴的代码)。