我正在尝试创建一个存储过程以添加到 SQL Server 中的购物篮。这个过程应该将人号、产品号和订单号作为输入,并将该产品放入订单中。它还应该能够在订单号中发送 NULL,然后应该创建一个新订单。
这些是我的表格:
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_Customerorder_Customer
CONSTRAINT FOREIGN KEY (PersonID)
REFERENCES Customer(PersonID)
);
CREATE TABLE ProductOrders
(
Ordernumber CHAR (10),
ProductID CHAR (10)
Number INT NOT NULL,
PK_Productorder
CONSTRAINT PRIMARY KEY (ordernumber, productID);
FK_Productorder_Customerorder
CONSTRAINT FOREIGN KEY (Ordernumber)
REFERENCES Customer order (ordernumber) ON DELETE CASCADE,
FK_Productorder_Product
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)
);
这是我的程序,行不通。我不知道我做错了什么。
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
最佳答案
首先查看一行是否存在然后更新它确实没有任何好处。只需更新它,然后检查是否更新了一行。您还混淆了所有列,并且将 PersonID 排除在插入之外。
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
这种类型的东西通常被称为 upsert。换句话说,它在单个过程中进行更新和插入。您也可以使用 MERGE 语句来完成此操作。 https://msdn.microsoft.com/en-us/library/bb510625.aspx
关于sql-server - 尝试在 SQL 中为购物篮创建存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40429948/