这个是个验证的问题,节前我也发过帖子(谢谢大家帮忙),这个存储过程是判断,用户输入的用户名是不是半角英数6位的问题,可以先不考虑半角,就是长度那地方出了问题,我输入5位或者更少是可以提示输入的不对,但是输入7位以上时就不提示错误,运行正常,不知道是怎么回事
CREATE PROCEDURE [dbo].[BAR_26_USAGI_USER_COPY] @UserID      char(06),
                                               @RoleKbn     char(01)
SET   NOCOUNT ON
BEGIN TRANSACTION
IF (PATINDEX('%[^a-zA-Z0-9]%',@UserId) > 0) OR (DATALENGTH(@UserId) <> 6) BEGIN
    select @ErType      = 1                                ,
           @ErSts       = 999999                           ,
           @TblID       = 'PARAM'                          ,
           @ErMsg       = '输入错误' ,
           @lgRetMode   = 1
    GOTO ERROR_PROC
END
ERROR_PROC:ROLLBACK TRANSACTION
select @wrklgInRecCNT  = 0,  @wrklgOutRecCNT = 0
select @wrklgShuryoSts = 'N'EXECUTE dbo.barError
希望大家帮下忙,我把char(06)的06去掉,那就是输入6位也有错误。

解决方案 »

  1.   


    错误原因很明显,因为你的存储过程参数@UserID      char(06),已经限定了大小。就算你调用的时候,给@UserID赋的值是100位,这里也只会取前6位,所以
    在程序里面判断时,DATALENGTH(@UserId)当然是等于6的了。
    这里只需要把你的@UserID长度更改就行了。另外最好用varchar类型。如varchar(100)等等
      

  2.   


    如:
    declare @userid char(06)
    set @userid='12345'
    print @userid
    --结果:12345 set @userid='123456'
    print @userid
    --结果:123456 set @userid='1234567'
    print @userid
    --结果:123456 你把@userid的长度限制死了,才6位。所以你这里无论给它赋多长的字符串,结果最多才6位。