CREATE  PROCEDURE getchildid
@aid bigint,
@childid varchar(200) output
 AS
declare @curid bigint
declare @tid int
set @childid=convert(varchar,@aid)
set @childid=@childid+','
declare cur cursor local for select tradeid   from trades where parentid=@aid
open cur
fetch next from cur into @curidwhile(@@fetch_status=0)
begin
set @childid=@childid+convert(varchar,@curid)
exec getchildid @curid, @tid output

fetch next from cur into @curid
end
close cur
deallocate cur
GO只要加上红色部分就报"将数据类型varchar转换为int时出错"

解决方案 »

  1.   

    USE tempdb;
    GOCREATE  PROCEDURE getchildid 
    @aid bigint, 
    @childid varchar(200) output 
    AS 
    declare @curid bigint 
    declare @tid int 
    set @childid=convert(varchar,@aid) 
    set @childid=@childid+',' 
    --declare cur cursor local for select tradeid  from trades where parentid=@aid 
    --open cur 
    --fetch next from cur into @curid --while(@@fetch_status=0) 
    --begin 
    --set @childid=@childid+convert(varchar,@curid) 
    --exec getchildid @curid, @tid output --fetch next from cur into @curid 
    --end 
    --close cur 
    --deallocate cur 
    GO DECLARE
    @childid varchar(200);
    EXEC getchildid
    @aid = 1,
    @childid = @childid OUTPUT;
    SELECT @childid;
    GODROP PROC getchildid/*-- 结果
    --------------
    1,(1 行受影响)
    --*/
      

  2.   

    CREATE  PROCEDURE getchildid 
    @aid bigint, 
    @childid varchar(200) output 
    AS 
    declare @curid bigint 
    declare @tid int 
    set @childid=convert(varchar,@aid) 
    set @childid=@childid+',' 
    declare cur cursor local for select tradeid  from trades where parentid=@aid 
    open cur 
    fetch next from cur into @curid while(@@fetch_status=0) 
    begin 
    set @childid=@childid+convert(varchar,@curid) 
    exec getchildid @curid, @tid output   -- 问题在这一句, 你的 @tid 是做为接受 @childid 这个输出参数的值, @tid 是数字型, 而 @childid 是字符 型, 所以输出结果的时候会发生数据类型转换, 而你又在存储过程中为参数 @childid 赋予了不能转换为数字的数据, 所以调用存储过程会报错
                                          -- 个人感觉你这里的 @tid 没有用, 应该是用 @childid 才对fetch next from cur into @curid 
    end 
    close cur 
    deallocate cur 
    GO 
      

  3.   

    exec getchildid @curid, @tid output

    问题在这一句, 你的 @tid 是做为接受 @childid 这个输出参数的值, @tid 是数字型, 而 @childid 是字符 型, 所以输出结果的时候会发生数据类型转换, 而你又在存储过程中为参数 @childid 赋予了不能转换为数字的数据, 所以调用存储过程会报错
                                          -- 个人感觉你这里的 @tid 没有用, 应该是用 @childid 才对