【问题标题】:SQL Server stored procedure for Insert runs, but does not insert values into the table用于插入的 SQL Server 存储过程运行,但不向表中插入值
【发布时间】:2016-06-10 20:13:07
【问题描述】:

我已经编写了这个存储过程来将行项目添加到一个名为InvoiceLineItems 的表中。数据库确实有一些测试条目,并且此过程基于其他正在运行的插入存储过程。

由于某种原因,查询会成功执行,但值并没有真正插入到表中,我不知道为什么,特别是因为其他插入过程已经工作了。

成功将值插入表的代码:

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

不插入值的代码:

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

关于它为什么不插入值的任何想法?

【问题讨论】:

  • 你能格式化你的代码吗?这是不可读的边界。
  • 对不起,这是我第一次使用这个网站。我将如何格式化它?当我打开它时,它看起来是正确的,所以不确定我应该做什么。

标签: sql-server stored-procedures


【解决方案1】:

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

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

如果计算结果为TRUE,您的语句将终止,您将设置@ListPrice

您需要像在第一个语句中那样检查所有错误,如果不满足所有条件(没有错误),则设置您的变量并更新(插入)到您的表中。

【讨论】:

  • 谢谢!老实说,我在 IF 语句中忘记了这一点,而且我已经看了很长时间,甚至没有想到它。但它现在有效!谢谢!
  • 完全不用担心!
猜你喜欢
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
相关资源
最近更新 更多