求助,在函数内 对带副作用的或依赖于时间的运算符的使用无效。

sezvboyrul 2009-06-08 10:04:30
判断字符串是否为整数的函数。
ALTER FUNCTION [dbo].[isInteger]
(
@Param1 varchar(80)
)
RETURNS int
AS
begin
declare @returnInt int
begin try
if isnumeric(@Param1)=1 and floor(@Param1)=@Param1
set @returnInt=1
end try
begin catch
set @returnInt=0
end catch;
return @returnInt
END

报错
消息 443,级别 16,状态 14,过程 isInteger,第 17 行
在函数内的 'BEGIN TRY' 中对带副作用的或依赖于时间的运算符的使用无效。
消息 443,级别 16,状态 14,过程 isInteger,第 20 行
在函数内的 'END TRY' 中对带副作用的或依赖于时间的运算符的使用无效。
消息 443,级别 16,状态 14,过程 isInteger,第 21 行
在函数内的 'BEGIN CATCH' 中对带副作用的或依赖于时间的运算符的使用无效。
消息 443,级别 16,状态 14,过程 isInteger,第 23 行
...全文
4202 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sezvboyrul 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wzy_love_sly 的回复:]
05没错的


SQL codealter FUNCTION [dbo].[isInteger](@Param1 varchar(80))
RETURNS int
AS
begin
declare @returnInt int
set @returnInt=0
if isnumeric(@Param1)=1
if floor(@Param1)=@Param1
set @returnInt=1
return @returnInt
END

select dbo.isInteger('aaa')



把isnumeric和floor分2行写,看看
[/Quote]

如果 数据 类似 $001,就会报错的
sezvboyrul 2009-06-08
  • 打赏
  • 举报
回复
数据太多 也不知道什么情况产生这个错误的
sezvboyrul 2009-06-08
  • 打赏
  • 举报
回复
htl258 的结果还是有报错的情况,从数据类型varchar转换为float时出错!
nzperfect 2009-06-08
  • 打赏
  • 举报
回复
必须的.
wzy_love_sly 2009-06-08
  • 打赏
  • 举报
回复
05没错的

alter FUNCTION [dbo].[isInteger](@Param1 varchar(80))
RETURNS int
AS
begin
declare @returnInt int
set @returnInt=0
if isnumeric(@Param1)=1
if floor(@Param1)=@Param1
set @returnInt=1
return @returnInt
END

select dbo.isInteger('aaa')


把isnumeric和floor分2行写,看看
claro 2009-06-08
  • 打赏
  • 举报
回复
。。。
htl258_Tony 2009-06-08
  • 打赏
  • 举报
回复
create FUNCTION [dbo].[isInteger]
(
@Param1 varchar(80)
)
RETURNS int
AS
begin
declare @returnInt int
if isnumeric(@Param1)=1
begin
if floor(@Param1)=@Param1
set @returnInt=1
end
else
set @returnInt=0
return @returnInt
END

select [dbo].[isInteger]('a')
/*
-----------
0

(1 行受影响)
*/

select [dbo].[isInteger]('80')
/*
-----------
1

(1 行受影响)
*/
htl258_Tony 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sezvboyrul 的回复:]
引用 2 楼 wzy_love_sly 的回复:
SQL codecreate FUNCTION [dbo].[isInteger]
(
@Param1 varchar(80)
)
RETURNS int
AS
begin
declare @returnInt int
if isnumeric(@Param1)=1 and floor(@Param1)=@Param1
set @returnInt=1
else
set @returnInt=0
return @returnInt
END

那就用CAST转换一下类型.


兄弟多谢,不过你这样写在 调用的时候会报错,从数据类型转换为float时出错!
[/Quote]
sezvboyrul 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wzy_love_sly 的回复:]
SQL codecreate FUNCTION [dbo].[isInteger]
(
@Param1 varchar(80)
)
RETURNS int
AS
begin
declare @returnInt int
if isnumeric(@Param1)=1 and floor(@Param1)=@Param1
set @returnInt=1
else
set @returnInt=0
return @returnInt
END
[/Quote]

兄弟多谢,不过你这样写在 调用的时候会报错,从数据类型转换为float时出错!
Zoezs 2009-06-08
  • 打赏
  • 举报
回复
把try...catch拿掉试试。
wzy_love_sly 2009-06-08
  • 打赏
  • 举报
回复
create FUNCTION [dbo].[isInteger]
(
@Param1 varchar(80)
)
RETURNS int
AS
begin
declare @returnInt int
if isnumeric(@Param1)=1 and floor(@Param1)=@Param1
set @returnInt=1
else
set @returnInt=0
return @returnInt
END
wzy_love_sly 2009-06-08
  • 打赏
  • 举报
回复
下列语句在函数内有效: 

赋值语句。


TRY...CATCH 语句以外的流控制语句。


定义局部数据变量和局部游标的 DECLARE 语句。


SELECT 语句,其中的选择列表包含为局部变量分配值的表达式。


游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。


修改 table 局部变量的 INSERT、UPDATE 和 DELETE 语句。


调用扩展存储过程的 EXECUTE 语句。

22,206

社区成员

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

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