2016-06-10 55 views
1

我已经编写了此存储过程以将行项添加到名为InvoiceLineItems的表中。数据库确实有一些测试条目,并且此过程基于正在工作的其他插入存储过程。用于插入的SQL Server存储过程运行,但不会将值插入到表中

由于某种原因,查询将会成功执行,但这些值实际上并未插入到表中,而且我无法弄清楚为什么,尤其是因为其他插入过程已经奏效。

代码,它成功地将值插入表:

IF OBJECT_ID('sp_InsertInvoiceLineitems') IS NOT NULL 
    DROP PROC sp_InsertInvoiceLineitems; 
GO 

CREATE PROC sp_InsertInvoiceLineitems 
    @InvoiceID INT = NULL, 
    @ProductID INT = NULL, 
    @PQty TINYINT = NULL, 
    @ListPrice MONEY = NULL, 
    @ServiceID INT = NULL, 
    @ServiceCost MONEY = NULL, 
    @SQty TINYINT = NULL, 
    @TotalAmount MONEY = NULL 
AS 
BEGIN 
    IF @InvoiceID IS NULL 
     THROW 50001, 'Must enter an InvoiceID.', 1; 

    IF @ProductID IS NOT NULL AND @ProductID NOT IN (SELECT ProductID FROM Products) 
     THROW 50001, 'Please enter a valid ProductID.', 1; 

    IF @PQty IS NOT NULL AND @ProductID IS NOT NULL AND @PQty <= 0 
     THROW 50001, 'PQty must be greater than zero.', 1; 

    IF @ProductID IS NOT NULL 
     SET @ListPrice = (SELECT ListPrice FROM Products WHERE ProductID = @ProductID); 

    IF @ServiceID IS NOT NULL AND @ServiceID NOT IN (SELECT ServiceID FROM Services) 
     THROW 50001, 'Please enter a valid ServiceID.', 1; 

    IF @ServiceID IS NOT NULL 
     SET @ServiceCost = (SELECT ServiceCost FROM Services WHERE ServiceID = @ServiceID); 

    IF @SQty IS NOT NULL AND @ServiceID IS NOT NULL AND @Sqty <= 0 
     THROW 50001, 'SQty must be greater than zero.', 1; 

    IF @ProductID IS NOT NULL OR @ServiceID IS NOT NULL 
     SET @TotalAmount = ((@ListPrice*@PQty) + (@ServiceCost*@SQty)); 
    ELSE --All data is verified 
     INSERT INTO InvoiceLineItems (InvoiceID, ProductID, PQty, ListPrice, ServiceID, ServiceCost, SQty, TotalAmount) 
     VALUES (@InvoiceID, @ProductID, @PQty, @ListPrice, @ServiceID, @ServiceCost, @SQty, @TotalAmount); 
END 
GO 

为什么它不插入值的任何想法:

IF OBJECT_ID('sp_InsertInvoices') IS NOT NULL 
    DROP PROC sp_InsertInvoices; 
GO 

CREATE PROC sp_InsertInvoices 
    @CustomerID INT = NULL, 
    @TotalDue MONEY = NULL, 
    @Paid CHAR(3) = NULL 
AS 
BEGIN 
    IF @CustomerID IS NULL 
     THROW 50001, 'CustomerID cannot be null.', 1; 

    IF @TotalDue IS NULL 
     THROW 50001, 'TotalDue cannot be Null.', 1; 

    IF @TotalDue < 0 
     THROW 50001, 'TotalDue cannot be negative.', 1; 

    IF @Paid IS NULL 
     THROW 50001, 'Must specify if the balance is paid or not.', 1; 
    ELSE --All data is validated 
     INSERT INTO Invoices (CustomerID, TotalDue, Paid) 
     VALUES (@CustomerID, @TotalDue, @Paid) 
END 
GO 

不插入值的代码?

+1

你能格式化你的代码吗?这是临界不可读的。 –

+0

对不起,这是我第一次使用本网站。我将如何格式化它?当我打开它看起来是正确的,所以我不知道该怎么做。 – BriMead

回答

1

IF...ELSE中,ELSE或补充IF仅在前面的IF语句不满足时才执行。因此:

IF @ProductID IS NOT NULL SET @ListPrice = (SELECT ListPrice FROM Products WHERE ProductID = @ProductID)

如果返回TRUE你的声明会终止,你会设置了@ListPrice

您需要检查所有的错误就像你在你的第一个声明中所做的,如果所有条件都得不到满足(没有错误),然后设置你的变量和更新(插入)到表中。

+0

谢谢!老实说,我忘了这一点与IF语句,我一直在寻找了这么久,它甚至不来的想法。但它现在起作用了!谢谢! – BriMead

+0

完全没有后顾之忧! – scsimon

相关问题