# "OrdersAdd" 存储过程

说明：

"OrdersAdd"存储过程首先为正在创建的订单在Orders表内创建一个记录.然后,它将用户购物车内的全部商品添加到OrderDetails表，并清空用户的购物车。它在一次事务处理中执行此全部三个步骤。这样便确保了在向OrderDetails表添加记录并发生错误时，在Orders表中不会出现空订单。

定义：

    	CREATE Procedure CMRC_OrdersAdd
    	(
    		@CustomerID int,
    		@CartID     nvarchar(50),
    		@OrderDate  datetime,
    		@ShipDate   datetime,
    		@OrderID    int OUTPUT
    	)
    	AS

    	BEGIN TRAN AddOrder

    	/* Create the Order header */
    	INSERT INTO CMRC_Orders
    	(
    		CustomerID,
    		OrderDate,
    		ShipDate
    	)
    	VALUES
    	(
    		@CustomerID,
    		@OrderDate,
    		@ShipDate
    	)

    	SELECT
    		@OrderID = @@Identity

    	/* Copy items from given shopping cart to OrdersDetail table for given OrderID*/
    	INSERT INTO CMRC_OrderDetails
    	(
    		OrderID,
    		ProductID,
    		Quantity,
    		UnitCost
    	)

    	SELECT
    		@OrderID,
    		CMRC_ShoppingCart.ProductID,
    		Quantity,
    		CMRC_Products.UnitCost

    	FROM
    		CMRC_ShoppingCart
    	INNER JOIN CMRC_Products ON CMRC_ShoppingCart.ProductID = CMRC_Products.ProductID

    	WHERE
    		CartID = @CartID

    	/* Removal of  items from user's shopping cart will happen on the business layer*/
    	EXEC CMRC_ShoppingCartEmpty @CartId

    	COMMIT TRAN AddOrder

Database Tables Used:

Orders: Order表包含系统里全部订单的头信息。即所有实际购买的商品。在系统中，为了设置一个订单，用户必须为其购物车中的商品付帐)。在创建一个订单时，会在Orders表中添加一条记录，包括CustomerID, OrderDate和ShipDate.然后，订单中产品的所有相关信息被添加到下面将要讨论的OrderDetails表中。注意：如果没有提供OrderDate 或ShipDate，则会输入当前时间作为默认值。

OrderDetails: OrderDetails表系统中每个订单的详细产品信息。OrderDetails表为订单中的每个产品创建一个记录。包含该产品的ProductID, Quantity 和UnitCost。在OrderDetails表和Orders表间存在多对一的关系。注意：该表的主键是由OrderID与ProductID组成的复合键（因为这两项是保证记录唯一性的最低要求）。

ShoppingCart: ShoppingCart表记录用户已经购买的商品。主键是RecordID。CardID是我们用来识别当前登录用户身份的字符串。ShoppingCart表与Products表之间有多对一的关系。注意：如果没有提供Quality，默认值是1。