create function fun_chjg (@f_chbm varchar(15),
                          @vJglx varchar(20)='f_bzsj',
                          @f_dwxh int=0,
                          @f_bz int=0,
                          @f_ksrq varchar(8)='',
                          @f_jsrq varchar(8)='')
returns float
as
begin
  declare @jg float
  declare @Sql nvarchar(800) 
  set @jg=0
  if (@f_ksrq='') 
  begin
    select top 1 @jg=@vJglx from tbda_ch_jg where f_chbm=@f_chbm and f_dwxh=@f_dwxh and f_bz=@f_bz order by f_jsrq desc
  end
  else if (@f_jsrq='') 
  begin                                                                              
    select top 1 @jg=@vJglx from tbda_ch_jg where f_chbm=@f_chbm and f_dwxh=@f_dwxh and f_bz=@f_bz or (f_ksrq<=@f_jsrq and f_jsrq>=@f_jsrq) order by f_jsrq desc 
  end
  else
  begin
    select top 1 @jg=@vJglx from tbda_ch_jg where f_chbm=@f_chbm and f_dwxh=@f_dwxh and f_bz=@f_bz and (f_ksrq=@f_ksrq and f_jsrq=@f_jsrq) 
  end  
  return(@jg )
end
select f_chbm, dbo.fun_chjg(f_chbm,default,default,default,default,default) from tbda_ch服务器: 消息 8114,级别 16,状态 5,过程 fun_chjg,行 15
将数据类型 varchar 转换为 float 时出错。

解决方案 »

  1.   

    你的tbda_ch_jg 里有字段是float,而在这里对应参数是varchar,自己查去吧。
      

  2.   

    select top 1 @jg=@vJglx from tbda_ch_jg where f_chbm=@f_chbm and f_dwxh=@f_dwxh and f_bz=@f_bz order by f_jsrq desc这一句,@jg是float 型,怎么可以把@vJglx为varchar的值赋给它?
      

  3.   

    把@jg定义成varchar型,返回的时候 return cast(@jg as float)就行了
      

  4.   

    我改成下面这样也不行,大家还有什么法子create function fun_chjg (@f_chbm varchar(15),
                              @vJglx varchar(20)='f_bzsj',
                              @f_dwxh int=0,
                              @f_bz int=0,
                              @f_ksrq varchar(8)='',
                              @f_jsrq varchar(8)='')
    returns float
    as
    begin
      declare @jg float
      declare @Sql nvarchar(800) 
      if (@f_ksrq='') 
      begin
        set @Sql=N'select top 1 @jg='+@vJglx+' from tbda_ch_jg where f_chbm = '''+@f_chbm+''' and f_dwxh='+cast(@f_dwxh as varchar(10)) +' and f_bz='+cast(@f_bz as varchar(10))+' order by f_jsrq desc '
        exec sp_executesql @Sql,N'@jg float output',@jg output 
      end
      else if (@f_jsrq='') 
      begin                                                                              
        set @Sql=N'select top 1 @jg='+@vJglx+' from tbda_ch_jg where f_chbm = '''+@f_chbm+''' and f_dwxh='+cast(@f_dwxh as varchar(10)) +' and f_bz='+cast(@f_bz as varchar(10))+' or (f_ksrq<='''+@f_jsrq +''' and f_jsrq>='''+@f_jsrq+''') order by f_jsrq desc '
        exec sp_executesql @Sql,N'@jg float output',@jg output 
      end
      else
      begin
        set @Sql=N'select top 1 @jg='+@vJglx+' from tbda_ch_jg where f_chbm = '''+@f_chbm+''' and f_dwxh='+cast(@f_dwxh as varchar(10)) +' and f_bz='+cast(@f_bz as varchar(10))+' and (f_ksrq='''+@f_jsrq +''' and f_jsrq='''+@f_jsrq+''') order by f_jsrq desc '
        exec sp_executesql @Sql,N'@jg float output',@jg output 
      end  
      return(isnull(@jg,0))
    endselect f_chbm, dbo.fun_chjg(f_chbm,default,default,default,default,default) from tbda_ch服务器: 消息 557,级别 16,状态 2,过程 fun_chjg,行 15
    只有函数和扩展存储过程才能从函数内部执行。
      

  5.   

    exec sp_executesql @Sql,N'@jg float output',@jg output 函数里面不能用这个
      

  6.   

    可以换成这样处理:
    create function fun_chjg (@f_chbm varchar(15),
                              @vJglx varchar(20)='f_bzsj',
                              @f_dwxh int=0,
                              @f_bz int=0,
                              @f_ksrq varchar(8)='',
                              @f_jsrq varchar(8)='')
    returns float
    as
    begin
      declare @jg float
      declare @Sql nvarchar(800) 
      set @jg=0
      if (@f_ksrq='') 
      begin
        if @vJglx='f_bzsj' select top 1 @jg=f_bzsj from tbda_ch_jg where f_chbm=@f_chbm and f_dwxh=@f_dwxh and f_bz=@f_bz order by f_jsrq desc
       -- else if 
      end
      else if (@f_jsrq='') 
      begin                                                                              
        if @vJglx='f_bzsj' select top 1 @jg=@vJglx from tbda_ch_jg where f_chbm=@f_chbm and f_dwxh=@f_dwxh and f_bz=@f_bz or (f_ksrq<=@f_jsrq and f_jsrq>=@f_jsrq) order by f_jsrq desc 
       -- else if 
      end
      else
      begin
        if @vJglx='f_bzsj' select top 1 @jg=@vJglx from tbda_ch_jg where f_chbm=@f_chbm and f_dwxh=@f_dwxh and f_bz=@f_bz and (f_ksrq=@f_ksrq and f_jsrq=@f_jsrq) 
       -- else if 
      end  
      return(@jg)
    end
      

  7.   

    警告: 聚合或其它 SET 操作消除了空值。(所影响的行数为 2 行)存储过程: KNetDb_2006.dbo.p_rebuildggxh
    返回代码 = 0请问这个警告是什么意思?还有返回代码0表示什么,是不是表示成功了
      

  8.   

    警告: 聚合或其它 SET 操作消除了空值。这是正常的,聚合函数处理时会忽略为空值的列
    至于返回代码=0,是哪里的信息?
    把你代码贴出来看看
      

  9.   

    create proc PrTest
    (@var1 as int,
    @var2 as int output)
    as 
    begin
    set @var2=1000
    return 0
    enddeclare @YourVar1 int
    declare @YourVar2 int
    set @YourVar1=1
    set @YourVar2=1
    exec PrTest @YourVar1,@YourVar2
    --exec PrTest @YourVar1,@YourVar2 output
    select @YourVar2输出结果
    1
    若exec PrTest @YourVar1,@YourVar2 output
    则输出结果
    1000
      

  10.   

    提示是数据类型转换,,用convert进行数据类型转换