下面是我写的一个存储过程,因为第一次写这东西,不知道是不是语句写错,总是报错,大家帮看看:
CREATE PROCEDURE dbo.create_orderdetail
/*
(
@parameter1 datatype = default value,
@parameter2 datatype OUTPUT
)
*/
@goodsid char(10),
@goodsname varchar(250),
@goodsprice varchar(20),
@goodsnum varchar(10),
@orderid varchar(22),
@returnkey int output,
@userid varchar(20) 
AS
/* SET NOCOUNT ON */
begin transaction

select goodsstocknum from shop_goods(updlock) where  goodsid =@goodsid
if (goodsstocknum<>-1 and cast(@goodsid as int)<=goodsstocknum)
     begin
      if (cast(@goodsnum as int)<goodsstocknum)  /* 如果购买的数量小于库存,则更新库存和预销售数*/
         begin
             update shop_goods set goodsstocknum=goodsstocknum-cast(@goodsnum as int),goodsordersellnum=goodsordersellnum+cast(@goodsnum
as int) where goodsid=@goodsid
--插入详细列表
                 insert into orderdetail (goodsid,goodsname,goodsprice,goodsnum,orderid,userid) select @goodsid,@goodsname
,cast(@goodsprice as money),cast(@goodsnum as int),@orderid,@userid
        end
    else 
        begin 
    --购买数量等于库存更新商品列表并设置下线
             update shop_goods set goodsstocknum=goodsstocknum-cast(@goodsnum as int),goodsordersellnum=goodsordersellnum+cast(@goodsnum as int),visible='1' 
         where goodsid=@goodsid
         --插入详细列表                    
         insert into orderdetail (goodsid,goodsname,goodsprice,goodsnum,orderid,userid) select @goodsid,@goodsname
,cast(@goodsprice as money),cast(@goodsnum as int),@orderid,@userid
         end
        commit transaction   /*事务结束*/
    end 
else
    begin
       set @returnkey=0    /*有商品的购买数量大于库存,做记号*/
       rollback transaction
    end

RETURN

解决方案 »

  1.   

    select goodsstocknum from shop_goods(updlock) where  goodsid =@goodsid看一看 shop_goods 表中是不是有这个 goodsstocknum 列
      

  2.   

    我看过了有这个列,goodsstocknum的字段属性也是int型的
      

  3.   

    select goodsstocknum from shop_goods(updlock) where  goodsid =@goodsi看看
    select goodsstocknum from shop_goods with (nolock) where  goodsid =@goodsid
      

  4.   

    try:insert into orderdetail (goodsid,goodsname,goodsprice,goodsnum,orderid,userid) 
    values(@goodsid,@goodsname,cast(@goodsprice as money),cast(@goodsnum as int),@orderid,@userid)
      

  5.   

    to: BearRui(孤熊 | 带你去看海!) 
    现在是报错列名goodsstocknum无效,应该与您说的无关吧
      

  6.   

    http://www.cnblogs.com/goody9807/archive/2005/07/08/188475.html给你个例子!
      

  7.   

    那你又说该列确实存在,那怎么会是列名goodsstocknum无效啊!!!
      

  8.   


    列名不是变量,哪能直接计算!
    修改了一下没有什么错误了
    CREATE PROCEDURE dbo.create_orderdetail
    /*
    (
    @parameter1 datatype = default value,
    @parameter2 datatype OUTPUT
    )
    */
    @goodsid char(10),
    @goodsname varchar(250),
    @goodsprice varchar(20),
    @goodsnum varchar(10),
    @orderid varchar(22),
    @returnkey int output,
    @userid varchar(20) 
    ASdeclare @goodsstocknum int /* SET NOCOUNT ON */
    begin transaction

    set @goodsstocknum = (select goodsstocknum from shop_goods(updlock) where  goodsid =@goodsid)
    if (@goodsstocknum<>-1 and cast(@goodsid as int)<=@goodsstocknum)
         begin
          if (cast(@goodsnum as int)<@goodsstocknum)  /* 如果购买的数量小于库存,则更新库存和预销售数*/
             begin
                 update shop_goods set goodsstocknum=goodsstocknum-cast(@goodsnum as int),goodsordersellnum=goodsordersellnum+cast(@goodsnum
    as int) where goodsid=@goodsid
    --插入详细列表
                     insert into orderdetail (goodsid,goodsname,goodsprice,goodsnum,orderid,userid) select @goodsid,@goodsname
    ,cast(@goodsprice as money),cast(@goodsnum as int),@orderid,@userid
            end
        else 
            begin 
        --购买数量等于库存更新商品列表并设置下线
                 update shop_goods set goodsstocknum=goodsstocknum-cast(@goodsnum as int),goodsordersellnum=goodsordersellnum+cast(@goodsnum as int),visible='1' 
             where goodsid=@goodsid
             --插入详细列表                    
             insert into orderdetail (goodsid,goodsname,goodsprice,goodsnum,orderid,userid) select @goodsid,@goodsname
    ,cast(@goodsprice as money),cast(@goodsnum as int),@orderid,@userid
             end
            commit transaction   /*事务结束*/
        end 
    else
        begin
           set @returnkey=0    /*有商品的购买数量大于库存,做记号*/
           rollback transaction
        end

    RETURN
      

  9.   

    select goodsstocknum from shop_goods(updlock) where  goodsid =@goodsid
    if (goodsstocknum<>-1 and cast(@goodsid as int)<=goodsstocknum)你上面第一句还不会有错,但第二句那里goodsstocknum不是申明的变量,肯定不能这样操作啦。改成这样。declare @goodsstocknum int
    select @goodsstocknum from shop_goods(updlock) where goodsid =@goodsid
    if (@goodsstocknum<>-1 and cast(@goodsid as int)<=@goodsstocknum)后面的有比较goodsstocknum的你也按上面的方法去改。
      

  10.   

    最好去设断点,打印出sql语句,然后把sql语句拿到查询分析器里面运行,这样就知道错在哪了