这个是个验证的问题,节前我也发过帖子(谢谢大家帮忙),这个存储过程是判断,用户输入的用户名是不是半角英数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位也有错误。
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位也有错误。
错误原因很明显,因为你的存储过程参数@UserID char(06),已经限定了大小。就算你调用的时候,给@UserID赋的值是100位,这里也只会取前6位,所以
在程序里面判断时,DATALENGTH(@UserId)当然是等于6的了。
这里只需要把你的@UserID长度更改就行了。另外最好用varchar类型。如varchar(100)等等
如:
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位。