自定义函数 报错问题

xiaodongni 2014-10-10 10:27:00
我想自己写个函数实现把字符串按照 汉字,非汉字进行分隔成2个字符串
比如‘aaa天ddd' 分割成’aaaddd'和'天'
我写的是这样。(参数2用来控制用户到底要返回汉字字符串还是飞汉字字符串)
只是针对我的思路来提供解决,不要告诉我换个思路。返回类型设置成表这样的。
create function [dbo].[spilt_eng_chinese]
(@char varchar(1000),@type int)
returns varchar(1000)
as
begin
declare @eng varchar(1000)='',@chinese varchar(1000)=''
if (@type not in(1,2))
return '参数2必须是1或者0'
else
begin
while PATINDEX('%[吖-咗]%',@char)>0
begin
set @chinese=@chinese+SUBSTRING(@char,PATINDEX('%[吖-咗]%',@char),1)
set @char=STUFF(@char,PATINDEX('%[吖-咗]%',@char),1,'')
end
set @eng=@char
end
if(@type=1)
return @eng
else
return @chinese
end

我现在有2个问题
1,我先写判断@type 如果不是0或者1,直接报错‘参数2必须是0或者1’我这种不行。
2,后面报错。提示函数的最后一行必须是返回值。
没写过自定义函数。不太懂。
...全文
213 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
RICHEER COCA 2014-10-22
  • 打赏
  • 举报
回复
路过,学习了,谢谢
xiaodongni 2014-10-13
  • 打赏
  • 举报
回复
置顶一下 再来人帮我看看
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
引用 11 楼 alimake 的回复:
[quote=引用 9 楼 Tiger_Zhao 的回复:] 刚刚查了一下,自定义函数内不能使用 RAISERROR!所以没法直接报错。 你可以约定返回 NULL 表示有错,如果要返回具体的错误信息,再加一个 OUTPUT 型的参数。
但是这样还不是报错。在存储过程中调用这个函数。然后我们在判断下。 if @return is null 报错? 把报错信息都转换到函数外面来。通过判断返回值来判断吗。但是感觉这样这样以后每次用这个函数都要判断比较麻烦啊,实际业务中 你们没有碰到类似问题吗?[/quote]大部分都不需要,放到程序上去处理更方便更合理
Tiger_Zhao 2014-10-10
  • 打赏
  • 举报
回复
引用 11 楼 alimake 的回复:
[quote=引用 9 楼 Tiger_Zhao 的回复:] 刚刚查了一下,自定义函数内不能使用 RAISERROR!所以没法直接报错。 你可以约定返回 NULL 表示有错,如果要返回具体的错误信息,再加一个 OUTPUT 型的参数。
但是这样还不是报错。在存储过程中调用这个函数。然后我们在判断下。 if @return is null 报错? 把报错信息都转换到函数外面来。通过判断返回值来判断吗。但是感觉这样这样以后每次用这个函数都要判断比较麻烦啊,实际业务中 你们没有碰到类似问题吗?[/quote] 不知道你为什么老想着在SQL中报错? 实际前台程序处理返回值、Output参数远比响应错误容易。 用返回值当前步骤是明确的,而错误是不明确的。除非每个调用都单独写个 TRY..CATCH,但那样比返回值代码量更多。
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 12 楼 ky_min 的回复:
人家系统函数是二大爷,能比吗? 取个默认值,我的意思是,例如你的情况,0 和 1以外的情况不要,所以不是0或1就当成1或0来处理,当然这在有些情况不合理,也可以返回个默认值,比如0或1以外的就返回空,如#9的说法
请看11楼的我的回复
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 7 楼 wtujedp 的回复:
看看这样行不行
create function [dbo].[spilt_eng_chinese]
(@char varchar(1000),@type int)
returns varchar(1000)
as 
begin 
	declare @eng varchar(1000)='',@chinese varchar(1000)=''
	declare @return varchar(1000)= '参数2必须是1或者0';
	if (@type in (1,0))
	begin
		while  PATINDEX('%[吖-咗]%',@char)>0
		begin 
			 set @chinese=@chinese+SUBSTRING(@char,PATINDEX('%[吖-咗]%',@char),1)
			 set @char=STUFF(@char,PATINDEX('%[吖-咗]%',@char),1,'')
			  
			 set @eng=@char;
		 end
	end
	if @type=1
		set @return=@eng;
	else if @type=0
	set @return=@chinese;
		
	
	return @return;
 
 end 
 
你这个不行啊,对于参数2不在(0,1)之间的。你没有报错。直接返回一个字符串了。
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
人家系统函数是二大爷,能比吗? 取个默认值,我的意思是,例如你的情况,0 和 1以外的情况不要,所以不是0或1就当成1或0来处理,当然这在有些情况不合理,也可以返回个默认值,比如0或1以外的就返回空,如#9的说法
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 9 楼 Tiger_Zhao 的回复:
刚刚查了一下,自定义函数内不能使用 RAISERROR!所以没法直接报错。 你可以约定返回 NULL 表示有错,如果要返回具体的错误信息,再加一个 OUTPUT 型的参数。
但是这样还不是报错。在存储过程中调用这个函数。然后我们在判断下。 if @return is null 报错? 把报错信息都转换到函数外面来。通过判断返回值来判断吗。但是感觉这样这样以后每次用这个函数都要判断比较麻烦啊,实际业务中 你们没有碰到类似问题吗?
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 8 楼 ky_min 的回复:
我试了下,把自定义异常放进函数~~ 在函数内对带副作用的或依赖于时间的运算符的使用无效 我觉得与其报错,不如容错 不在范围内的东西,取个默认值
取个默认值啥意思。你写个代码出来 看看 我看看你是怎么处理的。我们用系统函数。他不是经常报错 参数超出范围这些吗?
Tiger_Zhao 2014-10-10
  • 打赏
  • 举报
回复
刚刚查了一下,自定义函数内不能使用 RAISERROR!所以没法直接报错。
你可以约定返回 NULL 表示有错,如果要返回具体的错误信息,再加一个 OUTPUT 型的参数。
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
我试了下,把自定义异常放进函数~~ 在函数内对带副作用的或依赖于时间的运算符的使用无效 我觉得与其报错,不如容错 不在范围内的东西,取个默认值
wtujedp 2014-10-10
  • 打赏
  • 举报
回复
看看这样行不行
create function [dbo].[spilt_eng_chinese]
(@char varchar(1000),@type int)
returns varchar(1000)
as 
begin 
	declare @eng varchar(1000)='',@chinese varchar(1000)=''
	declare @return varchar(1000)= '参数2必须是1或者0';
	if (@type in (1,0))
	begin
		while  PATINDEX('%[吖-咗]%',@char)>0
		begin 
			 set @chinese=@chinese+SUBSTRING(@char,PATINDEX('%[吖-咗]%',@char),1)
			 set @char=STUFF(@char,PATINDEX('%[吖-咗]%',@char),1,'')
			  
			 set @eng=@char;
		 end
	end
	if @type=1
		set @return=@eng;
	else if @type=0
	set @return=@chinese;
		
	
	return @return;
 
 end 
 
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 4 楼 ky_min 的回复:
[quote=引用 2 楼 alimake 的回复:] [quote=引用 1 楼 ky_min 的回复:] 1异常,你可以参考一下 http://www.cnblogs.com/renyb/archive/2012/05/23/2515139.html 2,你把两个赋成一个返回 不就可以了吗?
说了不想用表。我就像用2个。我就是自己想到这个功能随便写的。不是工作需要。 我就想知道以后碰到类似问题怎么解决。[/quote]我没说用表 我的意思是这个

DECLARE @RETURN VARCHAR(1000)
if(@type=1)
SET @RETURN = @eng 
else
SET @RETURN =  @chinese
RETURN @RETURN
[/quote] 这个好办法。我没想到。冷解决我的第二个问题。但是还是解决不了我的报错问题。
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
1、用 RAISERROR 语句 2、最后加一句 RETURN NULL,跑不到无所谓,符合语法规则而已。
第二个 问题完美解决。第一个问题我也看了下。要用RAISERROR 但是我没用过这个。 对他的参数啥的还不是很懂。在问个。我这个想提示‘参数2必须是0或者1’ 我是不是要自定义个报错信息。,还有用了RAISERROR 还要用个CATCH 是吧
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
引用 2 楼 alimake 的回复:
[quote=引用 1 楼 ky_min 的回复:] 1异常,你可以参考一下 http://www.cnblogs.com/renyb/archive/2012/05/23/2515139.html 2,你把两个赋成一个返回 不就可以了吗?
说了不想用表。我就像用2个。我就是自己想到这个功能随便写的。不是工作需要。 我就想知道以后碰到类似问题怎么解决。[/quote]我没说用表 我的意思是这个

DECLARE @RETURN VARCHAR(1000)
if(@type=1)
SET @RETURN = @eng 
else
SET @RETURN =  @chinese
RETURN @RETURN
Tiger_Zhao 2014-10-10
  • 打赏
  • 举报
回复
1、用 RAISERROR 语句
2、最后加一句 RETURN NULL,跑不到无所谓,符合语法规则而已。
xiaodongni 2014-10-10
  • 打赏
  • 举报
回复
引用 1 楼 ky_min 的回复:
1异常,你可以参考一下 http://www.cnblogs.com/renyb/archive/2012/05/23/2515139.html 2,你把两个赋成一个返回 不就可以了吗?
说了不想用表。我就像用2个。我就是自己想到这个功能随便写的。不是工作需要。 我就想知道以后碰到类似问题怎么解决。
还在加载中灬 2014-10-10
  • 打赏
  • 举报
回复
1异常,你可以参考一下 http://www.cnblogs.com/renyb/archive/2012/05/23/2515139.html 2,你把两个赋成一个返回 不就可以了吗?

22,209

社区成员

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

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