sql-server - 尝试在 SQL 中为购物篮创建存储过程

标签 sql-server database stored-procedures

我正在尝试创建一个存储过程以添加到 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/

相关文章:

sql - 在 SQL 中选择特定的不同列

sql-server - 如何备份 Amazon RDS MS SQL Server 数据库实例并在本地恢复

php - WordPress登录屏幕数据库问题

mysql - 如何向引用数据类型 blob 列的表添加外键

MYSQL - 语法错误

tsql - sql server 2005/2008 条件连接

sql-server - 实现访问控制列表与使用数据库角色和用户

java - 连接到 SQL Server 数据库

database - 更新datagridview和数据库vb.net

sql - 通过存储过程进行数据库分页