存储过程中varchar的长度超过8000怎么办啊

quexiangcheng 2006-03-21 01:06:32
存储过程中变量varchar的长度超过8000怎么办啊
有没有什么解决办法啊 100分送上,不够再加!!!
...全文
775 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
quexiangcheng 2006-03-21
  • 打赏
  • 举报
回复
原因是最后的执行语句
exec( @sql1+@sql2+@sql3+'
exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'
)

@sql4中的值仍然是两个字符串,并没有接收到查询出来的结果。

顺便说一下 我的数据库是Sqlserver2000,操作系统win2003
quexiangcheng 2006-03-21
  • 打赏
  • 举报
回复
刚才发现,其实邹大的第三种方法也通不过,他那个例子没有报错是因为@i足构的大
把7800改小一点就会出错 如set @i=200/@i。 就会报一个

服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: ',' 附近有语法错误。

--判断需要多少个变量来处理
select @i=max(len(值)) from #
print @i
set @i=7800/@i

--分组临时表
update # set gid=id/@i
select @i=max(gid) from #
quexiangcheng 2006-03-21
  • 打赏
  • 举报
回复
SET QUOTED_IDENTIFIER on
GO
SET ANSI_NULLS OFF
GO

--仓库网点报表
ALTER proc sp_ReportClientStock @DeptID varchar(5),@StartTime varchar(20),@ShortName varchar(50)
as
begin
---数量/车型/销售商
select count(*) as AccountStock,a.SortTypeName,b.ClientName into #tempClientStock from TrueStockDayhist a,Client b
where datediff(day,a.noteDate,@StartTime)=0
and b.ClientID=a.ExistCustID and ExistCustID<>'' and a.ClientName=@ShortName
group by a.SortTypeName,b.ClientName

select id=identity(int,0,1),gid=0
,值=',sum(case ClientName when '''
+ClientName+''' then 1 else 0 end) as [' +ClientName+']'
into # from(select distinct ClientName from Client) a

declare @sqlhead varchar(8000),@sqlend varchar(8000)
,@sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000),@sql4 varchar(8000)
,@i int,@ic varchar(20)

--判断需要多少个变量来处理
select @i=max(len(值)) from #
print @i
set @i=7800/@i

--分组临时表
update # set gid=id/@i
select @i=max(gid) from #

--生成数据处理语句
select @sqlhead='''select SortTypeName'''
,@sqlend=''' from #tempClientStock group by SortTypeName'''
,@sql1='',@sql2='select ',@sql3='',@sql4=''

while @i>=0
select @ic=cast(@i as varchar),@i=@i-1
,@sql1='@'+@ic+' varchar(8000),'+@sql1
,@sql2=@sql2+'@'+@ic+'='''','
,@sql3='select @'+@ic+'=@'+@ic+'+a from # where gid='+@ic
+char(13)+@sql3
,@sql4=@sql4+',@'+@ic

select @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13)
,@sql2=left(@sql2,len(@sql2)-1)+char(13)
,@sql3=left(@sql3,len(@sql3)-1)
,@sql4=substring(@sql4,2,8000)

--执行
exec( @sql1+@sql2+@sql3+'
exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'
)

--删除临时表
drop table #
drop table #tempClientStock
end

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

sp_ReportClientStock 'aaa','2005.3.10','aaaa'

大家看看我这里哪里错了 ???
执行时老报一个错误!!太奇怪了

服务器: 消息 170,级别 15,状态 1,行 2
第 2 行: ',' 附近有语法错误。
huailairen 2006-03-21
  • 打赏
  • 举报
回复
假如说能用表变量的话,感觉还是表变量来处理复杂的东西比较好,
那么长的一个sql语句,系统执行分析优化也好费劲的。
zlp321002 2006-03-21
  • 打赏
  • 举报
回复
--SQL Server 2005.
如果使用 char 或 varchar,建议执行以下操作:

如果列数据项的大小一致,则使用 char。


如果列数据项的大小差异相当大,则使用 varchar。


如果列数据项大小相差很大,而且大小可能超过 8,000 字节,请使用 varchar(max)。


varchar [ ( n | max ) ]
可变长度,非 Unicode 字符数据。n 的取值范围为 1 至 8,000。max 指示最大存储大小是 2^31-1 个字节。存储大小是输入数据的实际长度加 2 个字节。所输入数据的长度可以为 0 个字符。SQL-2003 中的 varchar 就是 char varying 或 character varying。
xeqtr1982 2006-03-21
  • 打赏
  • 举报
回复
参看邹老大blog,有详细解答
http://blog.csdn.net/zjcxc/archive/2003/12/29/20075.aspx

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧