日期:2014-05-19  浏览次数:20513 次

EXECUTE 后的事务计数指出缺少了 COMMIT 或 ROLLBACK TRANSACTION 语句。原计数 = 0,当前计数 = 1
下面的存储过程哪儿有问题:
望大虾们指点.
  CREATE   PROCEDURE   dbo.spOrdersInsert
(
        @CustomerID   INT,
        @CartID           VARCHAR(50),
        @Memo VARCHAR(2000),
        @OrderID         INT   OUTPUT
)
AS

--   确保数据的一致性,   因而起用事务
BEGIN   TRAN   OrdersInsert

/*   产生订单   */
INSERT   INTO   Orders
(
        CustomerID,
        Memo
)
VALUES
(
        @CustomerID,
        @Memo
)

--   返回当前所产生的OrderID
SELECT
        @OrderID   =   @@Identity        

/*   将当前用户的当前购物车COPY到当前所产生的ORDER明细中*/
INSERT   INTO   OrderDetails
(
        OrderID,  
        ProductID,  
        Quantity,  
        UnitCost
)

SELECT  
        @OrderID,  
        ShoppingCart.ProductID,  
        Quantity,  
        Products.UnitCost

FROM  
        ShoppingCart  
    INNER   JOIN   Products   ON   ShoppingCart.ProductID   =   Products.ProductID
   
WHERE  
        CartID   =   @CartID

/*   完成后,   清空当前购物车ID的所有明细*/
EXEC   spShoppingCartEmpty   @CartId

COMMIT   TRAN   OrdersInsert
GO


------解决方案--------------------
下面的存储过程哪儿有问题:
望大虾们指点.
CREATE PROCEDURE dbo.spOrdersInsert
(
@CustomerID INT,
@CartID VARCHAR(50),
@MemoVARCHAR(2000),/*少空格*/
@OrderID INT OUTPUT
)
AS

-- 确保数据的一致性, 因而起用事务
BEGIN TRAN

/* 产生订单 */
INSERT INTO Orders
(
CustomerID,
Memo
)
VALUES
(
@CustomerID,
@Memo /* 这个参数从哪里来的 */
)

-- 返回当前所产生的OrderID
SELECT
@OrderID = @@Identity /* 这句不起作用,因为没有标示字段增加 */

/* 将当前用户的当前购物车COPY到当前所产生的ORDER明细中*/
INSERT INTO OrderDetails
(
OrderID,
ProductID,
Quantity,
UnitCost
)/* Values部分呢? */

/* 这个选择也没有任何作用 */
SELECT
@OrderID,
ShoppingCart.ProductID,
Quantity,
Products.UnitCost

FROM
ShoppingCart
INNER JOIN Products ON ShoppingCart.ProductID = Products.ProductID

WHERE
CartID = @CartID

/* 完成后, 清空当前购物车ID的所有明细*/
EXEC spShoppingCartEmpty @CartId

COMMIT TRAN OrdersInsert/* 直接Commit就可以了 */
GO