日期:2014-05-18  浏览次数:20731 次

将 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 空值。

------解决方案--------------------
呵呵