将 varchar 值 'null' 转换为数据类型为 int 的列时发生语法错误
if exists(select * from sysobjects where name= 'pGetPropertyID ')
drop proc pGetPropertyID
go
create proc pGetPropertyID
@PropertyTypID varchar(20),--资产类别编号01-06
@PropertyID varchar(20) output--返回符合条件的编号,没有符合的返回字符串的 'null '
as
declare @s varchar(8000)
select @s= 'select PropertyID from tbBaoFeiZiChanID where PropertyID like ' ' '+@PropertyTypID+ '% ' '
and datepart(year,BaoFeiDate) <datepart(year,getdate()) order by PropertyID '
exec( 'declare myCur cursor for '+@s)
open myCur
fetch next from myCur into @PropertyID --取第一条记录
if(@PropertyID is not null) --如果有符合条件的编号
begin
close myCur
deallocate myCur
return @PropertyID
--print @PropertyID
end
else
begin
close myCur
deallocate myCur
return 'null '
--print 'null '
end
go
declare @s varchar(20)
exec pGetPropertyID '03 ',@s output
print @s
1、这时确实没有查询到记录,但是我@PropertyID 明明是varchar啊。为什么是这个提示
2、else那我改为return '0 '后倒没出错,但是最后什么都没print出来,应该是 '0 '才对 嘛
3、请问存储过程中出错或者查不到记录时大家一般怎么定义返回值?
谢谢
[解决办法]
当在存储过程中使用 RETURN 语句时,此语句可以指定返回给调用应用程序、批处理或过程的整数值。如果 RETURN 未指定值,则存储过程返回 0。
既然,@PropertyID你已经指定output参数了,就不需要再返回它了.成功就返回0,失败返回-1好了.
[解决办法]
存储过程以下列几种形式返回数据:
一、SELECT 语句的结果集
这些语句包含在该存储过程内或该存储过程所调用的任何其它存储过程内。
二、输出参数
既可以返回数据(数值型或字符型等),也可以返回游标变量(可从存储过程外引用的全局游标)。
你定义的“@PropertyID”就是一个输出参数:@PropertyID varchar(20) output
三、返回代码
由存储过程中的 RETURN 语句返回,始终是整型值。如果没有显式使用 RETURN 返回,默认返回0。指定了 RETURN 语句,等于无条件退出存储过程,后续代码忽略不执行。
你在存储过程中使用“RETURN @PropertyID”是错误的,因为@PropertyID是字符数据。
下面分析你的存储过程:
从你的上下文分析,你应该是将输出参数和返回代码混为一谈了:
declare @s varchar(20)
exec pGetPropertyID '03 ',@s output
print @s
这里打印的是 @PropertyID 并不是你想要的:return 0
返回代码应该是这样获取:
declare @s varchar(20), @retval int
exec @retval = pGetPropertyID '03 ',@s output
select @retval
小提示:在调试存储过程的时候,可使用 RETURN 语句实现类似断点的功能。存储过程中出错或者查不到记录时,根据错误提示、判断,在存储过程相应的地方,SELECT 或 PRINT 相关的参数、SELECT 相关的记录集,之后使用 RETURN 直接退出。
最后:如果你的存储过程仅仅是为了获取一个PropertyID,没必要定义个 myCur 游标,可以这样:
declare @s nvarchar(4000) --注意:一定要nvarchar
select @s= 'select top 1 @PropertyID = PropertyID from tbBaoFeiZiChanID where PropertyID like ' ' '+@PropertyTypID+ '% ' '
and datepart(year,BaoFeiDate) <datepart(year,getdate()) order by PropertyID '
exec sp_executesql @s, N '@PropertyID varchar(20) output ', @PropertyID output
这样就行了,如果没有匹配的记录,@PropertyID 自然是 NULL 空值。
[解决办法]
呵呵