关于该如何定义SQL用户函数取单元格内值?

在SQL Server2005中定义了一个用户函数,想达到在单元格中取出段落1与段落2之间的文字效果。具体如下: Create function dbo.mid (@content varchar(1000),@text1 varchar(30),@text2 varchar(30)) --@content is one paragraph where I wanna search target words. --@text1 is the words before target words. --@text2 is the words after target words. returns varchar(30) as begin declare @spaceindex1 int,@spaceindex2 int,@return varchar(30) set @spaceindex1=charindex(@text1,@content) set @spaceindex2=charindex(@text2,@content) set @return=substring(@content,@spaceindex1+len(@text1),@spaceindex2-@spaceindex1-len(@text1)) return @return end 定义完成后,使用该用户定义函数: Select dbo.mid ('baidu','b','u') 则能够返回 aid 但是用在对应的表中时,例如: select dbo.mid (tab1,'我的名字是:',',请多多关照.') from table1 会报 "消息 536,级别 16,状态 5,第 1行 传递到 SUBSTRING 函数的长度参数无效." 试过把substring中的长度参数从@spaceindex2-@spaceindex1-len(@text1)改为@spaceindex2-@spaceindex1-convert(varchar(20),len(@text1)) 依然上述错误 试过把每个参数都改为varchar(1000),依然报错。 我现在只能把substring中的长度参数改为@spaceindex2-@spaceindex1 这样不会报错了。但是这样的话我需要在用到的时候手动删除每个后面的多余字符。 请高手帮忙,如何修改可以到达所需效果,谢谢!

FFIVE
浏览 276回答 1
1回答

茅侃侃

substring参数使用不正确,很明显,错误也在提示你这个原因!substring一共要三个参数,第一个为要截的字符,第二个为字符串截取的起始位置,最后一个为要截取的长度!很明显你要截取的字符串是@content,起始位置为@spaceindex1+len(@text1),长度为@spaceindex2-@spaceindex1-len(@text1)这几个值你写的都是正确的,但我们必须要考虑一些意外情况!varchar与nvarchar两者之间的区别!还有就是查找不到的情况!比如你输入的错了一个字符,那么就会导致@spaceindex1与@spaceindex2都为0第一个式子还好说,而第二个,也就是说长度会变为负值,而substring就会报错!所以我们不妨先测试一下@spaceindex2的值,若为0时,则直接让其等于len(@content),这样如果查不到由直接返回整个字串,当然如果是@spaceindex1不为0时,还可以照样截取.另一种情况也是你程序中常出现的错误!set@spaceindex2=charindex(@text2,@content)如果反过来了,也是得到的负值的.好在charindex支持第三个参数!set@spaceindex2=charindex(@text2,@content,@spaceindex1+1)这样做的目的是保证@spaceindex2大于@spaceindex1,否则照出现错误!为了杜绝重复引起的错误,最好是set@spaceindex2=charindex(@text2,@content,@spaceindex1+1+len(@text1))这样保证了@spaceindex2-len(@text1)也大于@spaceindex1最后的那个varchar与nvarchar两者的区别,建议你如果处理有中文最好用nvarchar,因为这两个在统计长度是不至于出错的!
打开App,查看更多内容
随时随地看视频慕课网APP