插入的SQL AddlineItem过程错误 [英] SQL AddlineItem procedure error for insert

查看:72
本文介绍了插入的SQL AddlineItem过程错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所有进程都运行到ADDLINEITEM过程并得到以下错误?我在GETDETAIL PROCEDURE中处理Detail列的NULL,如下所示:SELECT @vNewDetail = ISNULL(MAX(ORDERITEMS.detail),1)+ 1但仍然存在相同的错误。不确定为什么?



P.S. ADDLINEITEM过程还执行下面的GetNewDetail过程。



目前陷入此错误:

Msg 515,Level 16,State 2,Procedure AddLineItem,第33行

无法将值NULL插入列表Salesdb.test.ORDERITEMS'';列不允许空值。 INSERT失败。

该声明已被终止。

------------------------- -------------------------------------------------- --------------



/ *

---------- -------------------------------------------------- --------------------

TRANSACTION,此过程调用GetNewDetail并对ORDERITEMS执行INSERT

表然后对INVENTORY表执行UPDATE。

错误处理确定COMMIT / ROLLBACK。

--------------- -------------------------------------------------- ---------------

* /



All the process runs upto ADDLINEITEM procedure and getting the error below? I am handling the NULL for the Detail column in the GETDETAIL PROCEDURE like this: SELECT @vNewDetail = ISNULL(MAX(ORDERITEMS.detail),1) +1 but still geting the same error. Not sure Why?

P.S. ADDLINEITEM procedure also EXECUTES GetNewDetail procedure below.

Currently got stuck in this error:
Msg 515, Level 16, State 2, Procedure AddLineItem, Line 33
Cannot insert the value NULL into column table Salesdb.test.ORDERITEMS''; column does not allow nulls. INSERT fails.
The statement has been terminated.
-----------------------------------------------------------------------------------------

/*
--------------------------------------------------------------------------------
The TRANSACTION, this procedure calls GetNewDetail and performs an INSERT
to the ORDERITEMS table which in turn performs an UPDATE to the INVENTORY table.
Error handling determines COMMIT/ROLLBACK.
--------------------------------------------------------------------------------
*/

IF EXISTS (SELECT name FROM SYSOBJECTS WHERE name = 'AddLineItem')
    BEGIN DROP PROCEDURE AddLineItem; END;
GO

CREATE PROCEDURE AddLineItem --with orderid, partid and qty input

@vOrderId	VARCHAR(10),	
@vPartId	SMALLINT,	
@vQty	        SMALLINT,
@Stockqty	SMALLINT,
@vNewDetail     SMALLINT OUTPUT	
AS

DECLARE @vErr    SMALLINT       -- Error indicator 
DECLARE @vErrStr VARCHAR(80)    -- Hold error message

BEGIN TRANSACTION  --- this is the only BEGIN TRANSACTION 
    SET @vErr = 0 
    -- Check that requested Order No exists 
    SELECT @vOrderid = Orderid
      FROM ORDERITEMS
     WHERE OrderID = @vOrderID
     
     --Call
      EXECUTE GetNewDetail @vOrderId, @vNewDetail OUTPUT;

    IF (@@ERROR <> 0 OR @@ROWCOUNT = 0) 
        BEGIN 
            SET @vErr = 1 
            SET @vErrStr = 'ERROR1 in AddlineItemSP: Order Number ' + @vOrderID + 
                           ' does not exist. Unable to complete order.' 
        END; 
    ELSE 
        BEGIN 
            -- Insert order record into OrderItems table 
           INSERT INTO ORDERITEMS  
                         (orderid, partid, qty)
                  VALUES (@vorderid,@vpartid,@vqty);
            --ERROR HANDLING
            IF (@@ERROR <> 0) 
                BEGIN 
                    -- Error somewhere during the Insert 
                    SET @vErr = 2 
                    SET @vErrStr = 'ERROR2 in AddlineItemSP: Unable to Insert Order No ' + @vOrderID 
                END 
            --END IF

        END; 
    -- END IF
    -- The use of the system procedure RAISERROR allows identifying errors that occur elsewhere  
    -- and doing any rollback/commit here, not in triggers 
    IF (@vErr <> 0) 
        BEGIN 
            PRINT @vErrStr 
            PRINT 'Order No '   + @vOrderid + 
                  ' for '       + CONVERT(VARCHAR(4),@vQty)     + 
                  ' terminated with failure.' 
            ROLLBACK TRANSACTION 
        END; 
    ELSE 
        BEGIN 
            PRINT @vErrStr 
            PRINT 'Order No '   + @vOrderid + 
                  ' for '       + CONVERT(VARCHAR(4),@vQty)     + 
                  ' completed successfully' 
        COMMIT TRANSACTION 
        END;
	-- END IF

-- END TRANSACTION;   --leave it commented out
--END;
GO

-- No AddLineItem tests, saved for main block testing
--EXECUTE AddLineItem 1007,1001,10,4
GO

/* 

-------------------------------------------------------------------------------
/*
--------------------------------------------------------------------------------
ORDERITEMS.Detail determines new value:
You can handle NULL within the projection but it can be done in two steps
(SELECT and then test).  It is important to deal with the possibility of NULL
because the detail is part of the primary key and therefore cannot contain NULL.
--------------------------------------------------------------------------------
*/
IF EXISTS (SELECT name FROM SYSOBJECTS WHERE name = 'GetNewDetail')
    BEGIN DROP PROCEDURE GetNewDetail; END;
GO

CREATE PROCEDURE GetNewDetail 
@vOrderid SMALLINT, --input
@vNewDetail SMALLINT OUTPUT
AS 
BEGIN 
-- Use @vOrderid (input) to get @vNewDetail (output) via a query;
  --SET @vNewDetail = ORDERITEMS.detail;
  --Get MAX detail and Add 1 to it before inserting 
   SELECT @vNewDetail =  ISNULL(MAX(ORDERITEMS.detail),1) +1
     --INTO @vNewDetail    
  FROM ORDERITEMS
  WHERE Orderid = @vOrderid;
END;
GO

-- testing block for GetNewDetail
BEGIN 
DECLARE @vOrderid CHAR(100),  -- holds value returned from procedure
        @vNewDetail CHAR(100); 
        
EXECUTE GetNewDetail 6099, @vNewDetail  OUTPUT;
--EXECUTE getnewdetail 6099, @vDetail OUTPUT;        
PRINT 'New Detail#  is for: ' + @vOrderid +  @vNewDetail ;  
--ORDER THAT HAS NO DETAIL 6007 LIKE OTHER TEST I DID
END;
GO

推荐答案

尚无解决方案。我不是故意要使用这个盒子。
No solution is availabe yet. I didn''t mean to use this box.


这篇关于插入的SQL AddlineItem过程错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆