2016-06-10 7 views
1

Ich habe diese gespeicherte Prozedur geschrieben, um Elemente in eine Tabelle mit dem Namen InvoiceLineItems hinzuzufügen. Die Datenbank verfügt über einige Testeinträge, und diese Prozedur basiert auf anderen eingefügten gespeicherten Prozeduren, die funktionieren.Gespeicherte SQL Server-Prozedur für Insert-Läufe, aber keine Werte in die Tabelle einfügen

Aus irgendeinem Grund wird die Abfrage erfolgreich ausgeführt, aber die Werte werden nicht tatsächlich in die Tabelle eingefügt, und ich kann nicht herausfinden, warum, vor allem, da die anderen Einfügeverfahren funktioniert haben.

-Code, die erfolgreich Werte in eine Tabelle einfügt:

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 

Der Code, der keine Werte einfügen:

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 

Irgendwelche Gedanken darüber, warum sie nicht die Werte einfügen?

+1

Können Sie bitte Ihren Code formatieren? Dies ist grenzwertig nicht lesbar. –

+0

Entschuldigung, dies ist das erste Mal, dass ich diese Seite nutze. Wie würde ich es formatieren? Wenn ich es öffne, sieht es richtig aus, so unsicher, was ich tun soll. – BriMead

Antwort

1

In IF...ELSE werden die ELSE oder ergänzende IF nur dann ausgeführt, wenn die Anweisung IF vorhergehenden (n) nicht erfüllt sind. Deshalb:

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

Wenn dies TRUE wertet Ihre Aussage wird beendet, und Sie werden eine @ListPrice gesetzt haben.

Sie müssen auf ALLE Fehler überprüfen, wie Sie in Ihrer ersten Anweisung getan haben, und wenn ALLE Bedingungen nicht erfüllt sind (es gibt keine Fehler), dann setzen Sie Ihre Variablen und update (einfügen) in Ihre Tabelle.

+0

Danke! Ich habe das ehrlich gesagt mit den IF-Erklärungen vergessen, und ich habe es so lange angeschaut, dass es mir gar nicht in den Sinn kam. Aber es funktioniert jetzt! Vielen Dank! – BriMead

+0

Keine Sorgen überhaupt! – scsimon

Verwandte Themen