-------------------------------------------------------
--建立存储过程
------------------------------------------------------
create procedure myProc(@returnVal nvarchar(4000) output)
as
set @returnVal='...'
go--------------------------------------------------------
/*
发现问题:
1.当@returnVal的长度很大时,只能得到前面4000个字符.
2.换成varchar(8000)也只有8000个字符,且没有中文的情况下.
3.text类型不能做参数.目的:
返回长字符串(>8000个字符).求解决方案,谢谢!
*/
----------------------------------------------------------

解决方案 »

  1.   

    使用
    varchar(max)--   测试一普通的varchar 
    declare   @str1   varchar(4001) 
    declare   @str2   varchar(4001) 
    select   @str1   =   replicate( '1 ',4001) 
    select   @str2   =   replicate( '2 ',4001) 
    select   len(@str1   +   @str2) --   8000 
    print   @str1 
    print   @str2 --   测试二  max的varchar 
    declare   @str1   varchar(8000) 
    declare   @str2   varchar(8000) 
    select   @str1   =   replicate( '1',8000) 
    select   @str2   =   replicate( '2',8001) 
    print   len(convert(varchar(max),@str1)+@str2) --   8002 
    print   len(convert(varchar(max),@str1)) --测试三
    declare   @str1   varchar(max) 
    select   @str1   =   replicate( '1 ',8006) 
    select   len(@str1) --   8000
      

  2.   

    -------------------------------------------------------
    --建立存储过程
    ------------------------------------------------------
    create procedure myProc(@returnVal nvarchar(4000) output)
    as
    set @returnVal='...'
    go
    --------------------------------------------------------
    --提出问题
    --------------------------------------------------------
    /*
    发现问题:
    1.当@returnVal的长度很大时,只能得到前面4000个字符.
    2.换成varchar(8000)也只有8000个字符,且没有中文的情况下.
    3.text类型不能做参数.目的:
    返回长字符串(>8000个字符).求解决方案,谢谢!
    */
      

  3.   

    2楼用的是sql2005吗?sql2000 怎么不行,我以前也看过别人说 varchar(max),但我试不成功
      

  4.   

    看来”返回长字符串>8000个字符“的确是个问题,sql server2000 摆渡下也没找到更好的,要不就将字符串转化成数据集返回
      

  5.   

    是05,但我测试完,max不还是8000吗?没看明白
    @returnVal nvarchar(4000) output,@returnVal nvarchar(4000) output
    写2个不行吗?
      

  6.   

    问题是游标在循环累加时组不成这个长字符串!
    对于局部变量,text、ntext 和 image 数据类型无效。
      

  7.   

    楼主,我的sql 2005 express, 用ntext做类型没有出错啊?
      

  8.   

    我上面搞错了,运行时出错了。楼主可以考虑使用XP(extended stored procedure)来做
      

  9.   

    如果是SQL 2005 的话,还可以考虑使用 CLR来写存储过程。
      

  10.   

    楼主用得4个嵌套的游标来写存储过程,相信不是高手也是老手了,给你个提示吧:
    定义临时表:
    declare #temp(returnVal text)
    在循环中将你的 set @returnVal=@returnVal+'...' 改成 insert into #temp(returnVal) values ('...')
    最后就select * from #temp 吧,
    累加的工作就交给C#吧.