Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 尝试在SQL中为购物篮创建存储过程_Sql Server_Database_Stored Procedures - Fatal编程技术网

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

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

我正在尝试创建一个存储过程,将其添加到SQLServer中的购物篮中。该程序应将人员编号、产品编号和订单编号作为输入,并将该产品放入订单。它还应该能够发送空的订单号,然后,一个新的订单应该被创建

这些是我的桌子:

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个。