传递到 SUBSTRING 函数的长度参数无效。

快乐无边 2009-09-01 04:00:15
传递到 SUBSTRING 函数的长度参数无效。
...全文
3110 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
huyong19781 2011-03-25
  • 打赏
  • 举报
回复
但是我存储过程里压根就没用上substring(),居然也报这个错
lianfeng5837 2010-02-09
  • 打赏
  • 举报
回复
我里面都没有截取字符串怎么也报这个错误啊,什么原因?
lbjfeng 2009-09-02
  • 打赏
  • 举报
回复
just learning~~~
快乐无边 2009-09-01
  • 打赏
  • 举报
回复
好了,解决了。
xiequan2 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 ajaxchen_615 的回复:]
传递到 SUBSTRING 函数的长度参数无效。
[/Quote]你的第3个参数小于0,所以会报错
华夏小卒 2009-09-01
  • 打赏
  • 举报
回复

print CHARINDEX(',',@ENDS)+1 ---加这四句看看 ,哪个不对
print CHARINDEX(',',@START)+1
print CHARINDEX(',',@EDATE)+1
print CHARINDEX(',',@EYEAR)+1

SET @ENDS=SUBSTRING(@ENDS,CHARINDEX(',',@ENDS)+1,8000)
SET @START=SUBSTRING(@START,CHARINDEX(',',@START)+1,8000)
SET @EDATE=SUBSTRING(@EDATE,CHARINDEX(',',@EDATE)+1,8000)
SET @EYEAR=SUBSTRING(@EYEAR,CHARINDEX(',',@EYEAR)+1,8000)
SET @NUMS=CHARINDEX(',',@START)
END
IF @@ERROR = 0
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
GO


ilovewalk 2009-09-01
  • 打赏
  • 举报
回复
用print把所有传入的参数打印出来看看,比较容易找到错误所在。
快乐无边 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sql77 的回复:]
CHARINDEX(',',@START)
确定','在变量中一定出现
[/Quote]

确定有,
SQL77 2009-09-01
  • 打赏
  • 举报
回复
CHARINDEX(',',@START)
确定','在变量中一定出现
快乐无边 2009-09-01
  • 打赏
  • 举报
回复
我用的是sql2005
快乐无边 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 soft_wsx 的回复:]
你定义变量时最大500,substtring取数是为4000呀!
把变量长度全部改为varchar(8000)试试看看!
[/Quote]

还是报错。
soft_wsx 2009-09-01
  • 打赏
  • 举报
回复
你定义变量时最大500,substtring取数是为4000呀!
把变量长度全部改为varchar(8000)试试看看!
快乐无边 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dawugui 的回复:]
引用楼主 ajaxchen_615 的回复:
传递到 SUBSTRING 函数的长度参数无效。

例如SUBSTRING (col , m , n)

但其实col的长度 <m或是 <n,所以报错.
[/Quote]

ALTER PROCEDURE ExamTime_ADD
@e_lessonid char(6),
@e_year VARCHAR(200),
@e_date VARCHAR(500),
@e_examtimeStart varchar(500),
@e_examtimeEnd varchar(500),
@e_createrID int

AS
DECLARE @START VARCHAR(500),@STARTRI VARCHAR(40)
DECLARE @ENDS VARCHAR(500),@ENDSTRI VARCHAR(40)
DECLARE @EDATE VARCHAR(500),@EDATETRI VARCHAR(15)
DECLARE @EYEAR VARCHAR(500),@EYEARRTI VARCHAR(5)
DECLARE @NUMS INT

BEGIN TRANSACTION

SET @START = @e_examtimeStart + ','
SET @ENDS = @e_examtimeEnd + ','
SET @EDATE = @e_date + ','
SET @EYEAR = @e_year + ','
SET @NUMS=CHARINDEX(',',@START)

WHILE @NUMS>0
BEGIN
SET @STARTRI=LEFT(@START,CHARINDEX(',',@START)-1)
SET @ENDSTRI=LEFT(@ENDS,CHARINDEX(',',@ENDS)-1)
SET @EDATETRI=LEFT(@EDATE,CHARINDEX(',',@EDATE)-1)
SET @EYEARRTI=LEFT(@EYEAR,CHARINDEX(',',@EYEAR)-1)
INSERT INTO [e_ExamTime](
[e_lessonid],[e_year],[e_date],[e_examtimeStart],[e_examtimeEnd],[e_createrID]
)VALUES(
@e_lessonid,@EYEARRTI,@EDATETRI,@STARTRI,@ENDSTRI,@e_createrID
)
SET @ENDS=SUBSTRING(@ENDS,CHARINDEX(',',@ENDS)+1,8000)
--SET @ENDS=RIGHT(@ENDS,LEN(@ENDS)-CHARINDEX(',',@ENDS))
SET @START=SUBSTRING(@START,CHARINDEX(',',@START)+1,8000)
--SET @START=RIGHT(@START,LEN(@START)-CHARINDEX(',',@START))
SET @EDATE=SUBSTRING(@EDATE,CHARINDEX(',',@EDATE)+1,8000)
--SET @EDATE=RIGHT(@EDATE,LEN(@EDATE)-CHARINDEX(',',@EDATE))
SET @EYEAR=SUBSTRING(@EYEAR,CHARINDEX(',',@EYEAR)+1,8000)
--SET @EYEAR=RIGHT(@EYEAR,LEN(@EYEAR)-CHARINDEX(',',@EYEAR))
SET @NUMS=CHARINDEX(',',@START)
END
IF @@ERROR = 0
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
GO
快乐无边 2009-09-01
  • 打赏
  • 举报
回复
ALTER PROCEDURE ExamTime_ADD
@e_lessonid char(6),
@e_year VARCHAR(200),
@e_date VARCHAR(500),
@e_examtimeStart varchar(500),
@e_examtimeEnd varchar(500),
@e_createrID int

AS
DECLARE @START VARCHAR(500),@STARTRI VARCHAR(40)
DECLARE @ENDS VARCHAR(500),@ENDSTRI VARCHAR(40)
DECLARE @EDATE VARCHAR(500),@EDATETRI VARCHAR(15)
DECLARE @EYEAR VARCHAR(500),@EYEARRTI VARCHAR(5)
DECLARE @NUMS INT

BEGIN TRANSACTION

SET @START = @e_examtimeStart + ','
SET @ENDS = @e_examtimeEnd + ','
SET @EDATE = @e_date + ','
SET @EYEAR = @e_year + ','
SET @NUMS=CHARINDEX(',',@START)

WHILE @NUMS>0
BEGIN
SET @STARTRI=LEFT(@START,CHARINDEX(',',@START)-1)
SET @ENDSTRI=LEFT(@ENDS,CHARINDEX(',',@ENDS)-1)
SET @EDATETRI=LEFT(@EDATE,CHARINDEX(',',@EDATE)-1)
SET @EYEARRTI=LEFT(@EYEAR,CHARINDEX(',',@EYEAR)-1)
INSERT INTO [e_ExamTime](
[e_lessonid],[e_year],[e_date],[e_examtimeStart],[e_examtimeEnd],[e_createrID]
)VALUES(
@e_lessonid,@EYEARRTI,@EDATETRI,@STARTRI,@ENDSTRI,@e_createrID
)
SET @ENDS=SUBSTRING(@ENDS,CHARINDEX(',',@ENDS)+1,8000)
--SET @ENDS=RIGHT(@ENDS,LEN(@ENDS)-CHARINDEX(',',@ENDS))
SET @START=SUBSTRING(@START,CHARINDEX(',',@START)+1,8000)
--SET @START=RIGHT(@START,LEN(@START)-CHARINDEX(',',@START))
SET @EDATE=SUBSTRING(@EDATE,CHARINDEX(',',@EDATE)+1,8000)
--SET @EDATE=RIGHT(@EDATE,LEN(@EDATE)-CHARINDEX(',',@EDATE))
SET @EYEAR=SUBSTRING(@EYEAR,CHARINDEX(',',@EYEAR)+1,8000)
--SET @EYEAR=RIGHT(@EYEAR,LEN(@EYEAR)-CHARINDEX(',',@EYEAR))
SET @NUMS=CHARINDEX(',',@START)
END
IF @@ERROR = 0
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
GO
dawugui 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 ajaxchen_615 的回复:]
传递到 SUBSTRING 函数的长度参数无效。
[/Quote]
例如SUBSTRING (col , m , n)

但其实col的长度<m或是<n,所以报错.
华夏小卒 2009-09-01
  • 打赏
  • 举报
回复
代码呢??
soft_wsx 2009-09-01
  • 打赏
  • 举报
回复
具体些,好吗?
SQL77 2009-09-01
  • 打赏
  • 举报
回复
应该是取完了,字符长度没这么长

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧