一个问题,存储过程高手请进

wangjiamin 2004-07-13 02:55:21
我在存储过程中拼写sql串(字符串,主要是条件非常复杂,这个sql是按照一定规则生成),executesql
然后执行。

我想问的是:SQL语言只能支持 nvarchar(4000),而我常用的sql串长的,超过16000
(不要奇怪,老的erp系统很复杂)


我怎么突破这个限制?
...全文
201 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pjy 2004-07-13
  • 打赏
  • 举报
回复
没有这个限制吧,好象不能用‘GO’!
wangjiamin 2004-07-13
  • 打赏
  • 举报
回复
pbsql
的方法不错,我可以接受。

但是 exec 拼写的sql串里面不能声名 cursor 吧?????
tomatowitch 2004-07-13
  • 打赏
  • 举报
回复
用varchar(8000)够吗?
zjcxc 2004-07-13
  • 打赏
  • 举报
回复
上面就是用多个变量合并处理的示例
zjcxc 2004-07-13
  • 打赏
  • 举报
回复
--有数据
create table tb(单位名称 varchar(10),日期 datetime,销售额 int)
insert into tb
select 'A单位','2001-01-01',100
union all select 'B单位','2001-01-02',101
union all select 'C单位','2001-01-03',102
union all select 'D单位','2001-01-04',103
union all select 'E单位','2001-01-05',104
union all select 'F单位','2001-01-06',105
union all select 'G单位','2001-01-07',106
union all select 'H单位','2001-01-08',107
union all select 'I单位','2001-01-09',108
union all select 'J单位','2001-01-11',109

/*-- 要求结果
日期 A单位 B单位 C单位 D单位 E单位 F单位 G单位 H单位 I单位 J单位
---------- ----- ----- ----- ----- ----- ----- ---- ---- ---- ------
2001-01-01 100 0 0 0 0 0 0 0 0 0
2001-01-02 0 101 0 0 0 0 0 0 0 0
2001-01-03 0 0 102 0 0 0 0 0 0 0
2001-01-04 0 0 0 103 0 0 0 0 0 0
2001-01-05 0 0 0 0 104 0 0 0 0 0
2001-01-06 0 0 0 0 0 105 0 0 0 0
2001-01-07 0 0 0 0 0 0 106 0 0 0
2001-01-08 0 0 0 0 0 0 0 107 0 0
2001-01-09 0 0 0 0 0 0 0 0 108 0
2001-01-11 0 0 0 0 0 0 0 0 0 109
--*/



--定义变量,估计需要多少个变量才能保存完所有数据
declare @sql0 nvarchar(4000),@sql1 nvarchar(4000)
--,...@sqln nvarchar(4000)

--生成数据处理临时表
select id=identity(int,0,1),groupid=0
,值=',['+单位名称 +']=sum(case 单位名称 when '''
+单位名称+''' then 销售额 else 0 end)'
into #temp from(select distinct 单位名称 from tb) a

--分组临时表,判断慨最多多少个单位可以组合成一个不超过8000的字符串,这里取假设为5个
update #temp set groupid=id/5 --5为每组的单位个数

--生成SQL语句处理字符串
--初始化
select @sql0=''
,@sql1=''
-- ...
-- ,@sqln

--得到处理字符串
select @sql0=@sql0+值 from #temp where groupid=0 --第一个变量
select @sql1=@sql1+值 from #temp where groupid=1 --第二个变量
--select @sqln=@sqln+值 from #temp where groupid=n --第n个变量

--查询
exec('select 日期=convert(varchar(10),日期,120)'
+@sql0+@sql1
-- ...+@sqln
+' from tb group by convert(varchar(10),日期,120)
')
老宛 2004-07-13
  • 打赏
  • 举报
回复
你的sql字符串能不能分成小的几个串执行,如果可以的话,用几个exec执行它,或放到循环里面去执行
pbsql 2004-07-13
  • 打赏
  • 举报
回复
1.分成多个SQL执行再合并
2.分成多个字符串,每个不超过8000,再exec(@sql1+@sql2+@sql3...)
wangjiamin 2004-07-13
  • 打赏
  • 举报
回复
??并且不要用sp_execute,用exec,这样好拼字符串.??

我倒是不知道这两个的区别?

但是,我定义变量就只能定义 nvarchar(4000),更大就出错了。几个变量拼起来也不让的
zjcxc 2004-07-13
  • 打赏
  • 举报
回复
并且不要用sp_execute,用exec,这样好拼字符串.
zjcxc 2004-07-13
  • 打赏
  • 举报
回复
用多个变量拼起来.

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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