无法插入空值 - 变量数据未存储在变量中
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 语句没有指定字段
(来自您粘贴的代码)。
我创建了一个存储过程,它将 运行 作为一项工作,但我收到一个错误,提示我无法插入空值,尽管我正在为我的设置值在我的更新 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 语句没有指定字段 (来自您粘贴的代码)。