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

quexiangcheng 2006-03-21 01:06:32
存储过程中变量varchar的长度超过8000怎么办啊
有没有什么解决办法啊 100分送上,不够再加!!!
...全文
581 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2006-03-21 01:06
社区公告
暂无公告