VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 809|回复: 4

存储过程调用一个自定义函数的问题?

[复制链接]

2

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-2-21 15:00:01 | 显示全部楼层 |阅读模式
存储过程如下:
CREATE PROCEDURE sp_Motive
(
       
        @EPUsersName nvarchar(50),
        @Motive  nvarchar(50),
        @Type int
)
AS
DECLARE @StrSql nvarchar(4000)
IF(@Type=1)
        BEGIN
                SET @StrSql='SELECT count(*) from BeiSen_EP_Log as b,BeiSen_Test as a,BeiSen_Users as c,Beisen_EP_Users as d where c.Users_Id=b.EP_LogUsersId and b.EP_LogTestId=a.Test_Id and b.EP_LogEPUsersId=d.EP_UsersId and d.EP_UsersName='''+@EPUsersName+'''  and b.EP_LogId>3008 and b.EP_LogTestId=42 and dbo.'+@Motive+'(EP_LogTestTypePerson)<30'
                EXEC sp_executesql @StrSql
        END
ELSE IF(@Type=2)
        BEGIN
                SET @StrSql='SELECT count(*) from BeiSen_EP_Log as b,BeiSen_Test as a,BeiSen_Users as c,Beisen_EP_Users as d where c.Users_Id=b.EP_LogUsersId and b.EP_LogTestId=a.Test_Id and b.EP_LogEPUsersId=d.EP_UsersId and d.EP_UsersName='''+@EPUsersName+'''  and b.EP_LogId>3008 and b.EP_LogTestId=42 and dbo.'+@Motive+'(EP_LogTestTypePerson)>=30 AND dbo.'+@Motive+'(EP_LogTestTypePerson)<=70'
                EXEC  sp_executesql @StrSql
        END
ELSE IF(@Type=3)
        BEGIN
                SET @StrSql='SELECT count(*) from BeiSen_EP_Log as b,BeiSen_Test as a,BeiSen_Users as c,Beisen_EP_Users as d where c.Users_Id=b.EP_LogUsersId and b.EP_LogTestId=a.Test_Id and b.EP_LogEPUsersId=d.EP_UsersId and d.EP_UsersName='''+@EPUsersName+'''  and b.EP_LogId>3008 and b.EP_LogTestId=42 and dbo.'+@Motive+'(EP_LogTestTypePerson)>70'
                EXEC sp_executesql @StrSql
        END
GO
自定义函数如下:
CREATE FUNCTION dbo.motivepower(@str nvarchar(50))
RETURNS int
BEGIN
DECLARE @start int
declare @end int
set @start=charindex('|',@str,charindex('|',@str,charindex('|',@str,charindex('|',@str)+1)+1)+1)+1
set @end=charindex('|',@str,charindex('|',@str,charindex('|',@str,charindex('|',@str,charindex('|',@str)+1)+1)+1)+1)
return convert(float,SUBSTRING(@str,@start,@end-@start))
END 其他的类似
数据库字段EP_LogTestTypePerson的值类似36.2|74.5|8.7|60|63.2|68.6|83.1|84|37.3|17|45.9
   调用的时候提示错误是:向 substring 函数传递了无效的 length 参数。
各位给点意见阿
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-5-5 13:00:02 | 显示全部楼层
在  帮助文档 中应该有 示例的 .......
回复

使用道具 举报

2

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-5-6 14:00:01 | 显示全部楼层
re:zjwzjw
帮助文档的事例我都看过了,不过没有解决问题。所以才来这个麻烦大家的。这个问题已经困扰我几天了。
回复

使用道具 举报

0

主题

12

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-8-3 22:45:01 | 显示全部楼层
在自定义函数中检查一下 @end,@start的值,出现这种问题有可能是 @end-@start的值小于0
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-8-26 11:00:01 | 显示全部楼层
CREATE FUNCTION dbo.motivepower(@str nvarchar(50))
RETURNS int
BEGIN
DECLARE @start int
declare @end int
set @start=charindex('|',@str,charindex('|',@str,charindex('|',@str,charindex('|',@str)+1)+1)+1)+1
set @end=charindex('|',@str,charindex('|',@str,charindex('|',@str,charindex('|',@str,charindex('|',@str)+1)+1)+1)+1)
/*
BUG1:
没有判断charindex('|',@str)是否大于0。
如果charindex('|',@str)>0,那么@start=1,@end=0,@end-@start=-1,报错。

BUG2:
没有判断@str有多少个值。代码应该是取第5个值。
但当只有4个分隔符“|”时,@end=0,而@start>0,@end-@start<0,报错。
*/
return convert(float,SUBSTRING(@str,@start,@end-@start))
END
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表