传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

qubick 2013-11-15 06:29:33
各位大神帮忙看下,有些表用这个脚本没有问题,有些表用这个 脚本就会报错。一般是输出20行左右就会固定报 这个错误。

Declare @id int
Set @id=1
while @id<=(select MAX([users_id]) from [CSMBTEST].[dbo].[Users])
begin


Declare @i int, @j int, @c nvarchar(max), @title nvarchar(max), @nt nvarchar(50) ,@allfraction int, @ip nvarchar(20), @examcount int
Set @nt=(select [Users_LoginName] from [CSMBTEST].[dbo].[Users] where [users_id]=@id)
Set @allfraction=(select [Users_AllFraction] from [CSMBTEST].[dbo].[Users] where [users_id]=@id)
Set @ip=(select [Users_Ip] from [CSMBTEST].[dbo].[Users] where [users_id]=@id)
Set @examcount=(select [Users_ExamCount] from [CSMBTEST].[dbo].[Users] where [users_id]=@id)
Set @c=(select replace(replace(replace([Users_Question],' ',''),'</p>','|||'),'</DIV>','|||')
from [CSMBTEST].[dbo].[Users] where [users_id]=@id)

Set @i=CHARINDEX('<',@c,1)
Set @j=CHARINDEX('>',@c,1)
while @i>0
begin
Set @c=LEFT(@c, @i-1) + right(@c, LEN(@C)-@j)
Set @i=CHARINDEX('<',@c,1)
Set @j=CHARINDEX('>',@c,1)
end
Set @title = LEFT(@c, CHARINDEX('|||', @c, 1)-1)
Set @c = Right(@c, len(@c)-CHARINDEX('|||', @c, 1)-2)
--select @c, @title

Declare @T table(Title nvarchar(max), text nvarchar(max))

Declare @h int, @v nvarchar(max)
Set @h=CHARINDEX('||||||',@c,1)

while @h>0
begin
Set @v=LEFT(@c, @h-1)
Set @c=Right(@c, len(@c)-@h-5)
insert into @T values(@title, RIGHT(@v,CHARINDEX(' ',REVERSE(@v)) ))
Set @h=CHARINDEX('||||||',@c,1)
end


INSERT INTO [CSMBTEST].[dbo].[Users_New]
select [Users_LoginName]=@nt
,[Users_AllFraction]=@allfraction
,[Users_Ip]=@ip
,[Users_ExamCount]=@examcount
--,[Question]=LEFT([Text],CHARINDEX('(',[Text] collate Chinese_PRC_CS_AS_WS)-1)
,[Question]=replace(SUBSTRING([Text],CHARINDEX('.',[Text])+1,CHARINDEX('(',[Text] collate Chinese_PRC_CS_AS_WS)- CHARINDEX('.',[Text])-1),'?','?')
,[Selection]=SUBSTRING([Text],CHARINDEX('(',[Text] collate Chinese_PRC_CS_AS_WS),CHARINDEX(')',[Text] collate Chinese_PRC_CS_AS_WS)-CHARINDEX('(',[Text] collate Chinese_PRC_CS_AS_WS)+1)
,[True_Flag]=CASE WHEN SUBSTRING([Text],CHARINDEX(')',[Text] collate Chinese_PRC_CS_AS_WS)+1,2)='正确' THEN 1 ELSE 0 END
,[Answer]=CASE WHEN CHARINDEX('正确答案:',[Text])=0 THEN NULL ELSE SUBSTRING([Text],CHARINDEX('正确答案:',[Text])+5,CHARINDEX('|||',[Text])-CHARINDEX('正确答案:',[Text])-5) END
,[Option]=SUBSTRING([Text],CHARINDEX('|||',[Text]),LEN([Text])-CHARINDEX('|||',[Text]))


From @T
ORDER BY [Users_LoginName] ASC

--每次插入后清空临时表
delete @T

set @id=@id+1
end
...全文
3789 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qubick 2013-12-10
  • 打赏
  • 举报
回复
按照版主的方法 还是没有找出来,但是 我知道 应该是left()函数的问题,后来去 看了数据库才发现有很多字段 多了 一些多余的字符导致没办法输出了。。。谢谢各位回复的朋友们~
唐诗三百首 2013-11-16
  • 打赏
  • 举报
回复
引用 6 楼 qubick 的回复:
好吧,看来要一个个拆分出来看看。。。不知道有哪位大神有比较简单的排除方法
逐个排查法,例如在每个LEFT或SUBSTRING函数之后加类似于print 1,print 2,print 3...的语句, 执行时,看打印出来1,2,3...中断在哪里,中断的那个left()或substring()函数就是有bug的.
LongRui888 2013-11-15
  • 打赏
  • 举报
回复
引用 8 楼 qubick 的回复:
原本不想这样的,可以原data里面有些数据是HTML的,必须用某些方法转化出来
你能不能找到,哪一行数据有问题,然后就用这行数据,来测试,找到有问题的left或substring
qubick 2013-11-15
  • 打赏
  • 举报
回复
原本不想这样的,可以原data里面有些数据是HTML的,必须用某些方法转化出来
tcmakebest 2013-11-15
  • 打赏
  • 举报
回复
看着好乱啊,把高级语言的功能用 SQL 来实现并不是好办法。
qubick 2013-11-15
  • 打赏
  • 举报
回复
引用 5 楼 yupeigu 的回复:
[quote=引用 2 楼 qubick 的回复:] [quote=引用 1 楼 shoppo0505 的回复:] 应该是Left或者Substring的第二个参数溢出了。不能取到数值。
怎么样确定是哪个参数呢?[/quote] 看样子,也只有用排除法了,因为你的代码里,有很多地方用到了 left 和 substring[/quote] 好吧,看来要一个个拆分出来看看。。。不知道有哪位大神有比较简单的排除方法
LongRui888 2013-11-15
  • 打赏
  • 举报
回复
引用 2 楼 qubick 的回复:
[quote=引用 1 楼 shoppo0505 的回复:] 应该是Left或者Substring的第二个参数溢出了。不能取到数值。
怎么样确定是哪个参数呢?[/quote] 看样子,也只有用排除法了,因为你的代码里,有很多地方用到了 left 和 substring
LongRui888 2013-11-15
  • 打赏
  • 举报
回复
肯定是,由于计算出来的长度是负数导致的
LongRui888 2013-11-15
  • 打赏
  • 举报
回复
应该是类似于这种情况:
select LEFT('aaa',-5)
/*
消息 536,级别 16,状态 1,第 4 行
传递到 left 函数的长度参数无效。
*/
qubick 2013-11-15
  • 打赏
  • 举报
回复
引用 1 楼 shoppo0505 的回复:
应该是Left或者Substring的第二个参数溢出了。不能取到数值。
怎么样确定是哪个参数呢?
shoppo0505 2013-11-15
  • 打赏
  • 举报
回复
应该是Left或者Substring的第二个参数溢出了。不能取到数值。

22,209

社区成员

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

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