Essayer de créer une procédure stockée pour le panier dans SQL

J'essaye de créer une procédure stockée qui s'ajoute au panier dans SQL Server. Cette procédure doit prendre en count le numéro de personne, le numéro de produit et le numéro de command et mettre ce produit en ordre. Il devrait également être capable d'envoyer NULL dans le numéro de command alors, une nouvelle command devrait être créée.

Ce sont mes tables:

CREATE TABLE Customer ( PersonID CHAR (10) PRIMARY KEY, Firstname varchar (50) NOT NULL, Name varchar (50) NOT NULL, Address varchar (50) NOT NULL, Zip INT NOT NULL, City varchar (50) NOT NULL, Telephone CHAR (10) Email VARCHAR (50) NOT NULL, ); CREATE TABLE Customerorder ( Order number CHAR (10) PRIMARY KEY, Date DATE NOT NULL, Time TIME NOT NULL, Total INT, PersonID CHAR (10) FK_Kundorder_Kund CONSTRAINT FOREIGN KEY (PersonID) REFERENCES Customer(PersonID) ); CREATE TABLE ProductOrders ( Ordernumber CHAR (10), ProductID CHAR (10) Number INT NOT NULL, PK_Produktorder CONSTRAINT PRIMARY KEY (ordernumber, productID); FK_Produktorder_Kundorder CONSTRAINT FOREIGN KEY (Ordernumber) REFERENCES Customer order (ordernumber) ON DELETE CASCADE, FK_Produktorder_Produkt CONSTRAINT FOREIGN KEY (productID) REFERENCES Product (productID) ON DELETE CASCADE ); CREATE TABLE Product ( ProductID CHAR (10) PRIMARY KEY, Amount INT NOT NULL, ModelID CHAR (10) CategoryID CHAR (10) CONSTRAINT FK_Product_Model FOREIGN KEY (ModelID) REFERENCES (ModelID) FK_Product_Category CONSTRAINT FOREIGN KEY (CategoryID) REFERENCES Category (CategoryID) ); 

C'est ma procédure, ça ne marchera pas. Je ne sais pas ce que je fais mal.

 CREATE PROCEDURE ADDToBasket (@Ordernumber char(10), @ProductID CHAR(10), @PersonID char(10) ) AS IF EXISTS (SELECT @Ordernumber FROM Customerorder WHERE Ordernumber = @Ordernumber AND PersonID = @PersonID) UPDATE Productorder SET Amount = Amount + 1 WHERE ProductID = @ProductID AND Ordernumber = @Ordernumber AND PersonID = @PersonID BEGIN INSERT INTO Productorder (Ordernumber, ProductID, Amount) VALUES (@Ordernumber, @PersonID, (SELECT ProductID FROM Product WHERE @ProductID = @ProductID)); END 

Il n'y a vraiment aucun avantage à voir d'abord si une ligne existe et ensuite la mettre à jour. Il suffit de le mettre à jour et de vérifier si une ligne a été mise à jour. Vous avez également toutes vos colonnes mélangées et vous avez quitté PersonID hors de votre insertion.

 CREATE PROCEDURE ADDToBasket ( @Ordernumber char(10), @ProductID CHAR(10) --, @PersonID char(10) don't think this is needed ) AS BEGIN SET NOCOUNT ON; UPDATE Productorder SET Amount = Amount + 1 WHERE ProductID = @ProductID AND Ordernumber = @Ordernumber AND PersonID = @PersonID IF @@ROWCOUNT = 0 INSERT INTO Productorder ( Ordernumber , ProductID , Amount ) VALUES ( @Ordernumber , @ProductID , 1 ) END 

Ce type de chose est communément appelé un upsert. En d'autres termes, il met à jour et insère dans une procédure unique. Vous pouvez également utiliser l'instruction MERGE pour cela. https://msdn.microsoft.com/en-us/library/bb510625.aspx

Vérifiez votre déclaration de début / fin à nouveau. Vous n'en avez pas besoin et si vous l'utilisez, assurez-vous qu'il est valide.

 CREATE PROCEDURE ADDToBasket ( @Ordernumber char(10), @ProductID CHAR(10), @PersonID char(10) ) AS BEGIN IF EXISTS (SELECT @Ordernumber FROM Customerorder WHERE Ordernumber = @Ordernumber AND PersonID = @PersonID) UPDATE Productorder SET Amount = Amount + 1 WHERE ProductID = @ProductID AND Ordernumber = @Ordernumber AND PersonID = @PersonID ELSE INSERT INTO Productorder (Ordernumber, ProductID, Amount) VALUES(@Ordernumber,@ProductID ,1) END