Sql server 尝试在SQL中为购物篮创建存储过程
我正在尝试创建一个存储过程,将其添加到SQLServer中的购物篮中。该程序应将人员编号、产品编号和订单编号作为输入,并将该产品放入订单。它还应该能够发送空的订单号,然后,一个新的订单应该被创建 这些是我的桌子:Sql server 尝试在SQL中为购物篮创建存储过程,sql-server,database,stored-procedures,Sql Server,Database,Stored Procedures,我正在尝试创建一个存储过程,将其添加到SQLServer中的购物篮中。该程序应将人员编号、产品编号和订单编号作为输入,并将该产品放入订单。它还应该能够发送空的订单号,然后,一个新的订单应该被创建 这些是我的桌子: CREATE TABLE Customer ( PersonID CHAR (10) PRIMARY KEY, Firstname varchar (50) NOT NULL, Name varchar (50) NOT NULL, Address va
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
再次检查开始/结束语句。您不需要它,如果您使用它,请确保它是有效的
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
首先查看一行是否存在,然后更新它,这确实没有什么好处。只需更新它,然后检查一行是否已更新。你也把你的专栏都搞混了,你把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
这种类型的东西通常被称为向上插入。换句话说,它在单个过程中进行更新和插入。您还可以使用MERGE语句来完成此操作 我认为他们不希望ProductID是这个代码所做的数量。实际上这根本不起作用,因为insert中的子查询将获取产品表中的每一行,因为where谓词是错误的。我总是在“AS”后面加一个BEGIN,在末尾加一个END。谢谢你的回答,但我仍然有一个问题。Productorder中不存在PersonID列。我的客户表中有我的人名。我怎样才能加入这两个?我需要这个程序来输入PersonID。我不明白你在这里的意思。你是对的,尽管那个人不在那张桌子上。这是你的原始插入的一部分,所以我只是认为它需要在那里。如果您有订单号,那么您真的不需要担心PersonID。如果您插入到ProductOrder表中,并且该表属于特定的PersonID,我认为您不必担心它。只需将其从上面移除即可。OrderNumber是唯一的,因此您不能有超过1个。