视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何解决动态查询语句太长,大于数据库字符的最大长度
2020-11-09 08:08:50 责编:小采
文档

上周,在写sql server2005 数据库 存储过程的时候,用到了 动态 查询 语句 ,但是由于 语句 太长,定义的变量最长为varchar(8000),在 字符 串 大于 8000的时候, 数据库 会做截断,进而在执行 动态 语句 时报错。 未 解决 此问题,找到了定义变量的 长度 var

上周,在写sql server2005数据库存储过程的时候,用到了动态查询语句,但是由于语句太长,定义的变量最长为varchar(8000),在字符串大于8000的时候,数据库会做截断,进而在执行动态语句时报错。


未解决此问题,找到了定义变量的长度varchar(max),基本语句如下:


declare

@v_cmdstr1 varchar(max)
,@v_cmdstr2 varchar(8000)


set @v_cmdstr1='select row_number()over (order by a.i_branch_no,a.vc_no) rn
,a.i_branch_no,b.bname as branch_name,a.vc_no
,c.vc_name,a.i_begin_date,a.i_end_date'
select @v_cmdstr1=@v_cmdstr1+',sum(case when a.c_relate_type='+convert(char(5),c_relate_type)
+' and a.vc_pro_code='+convert(varchar(32),vc_pro_code)
+' and a.vc_item_code='+convert(varchar(32),vc_item_code)
+' then isnull(a.en_occur_balance,0) else 0 end) as '+title_name
from (select top 500 c_relate_type,vc_pro_code,vc_item_code,title_name
from #check) t
set @v_cmdstr2=' into ##transitem from ##checkit a
left join seclose..branch b on a.i_broker_no=b.bid
left join sm..tb_operators c on a.vc_no = c.vc_no
group by a.i_branch_no,b.bname,a.vc_no
,c.vc_name,a.i_begin_date,a.i_end_date'
exec(@v_cmdstr1+@v_cmdstr2);


理论上,将变量 @v_cmdstr1 定义为 varchar(max)之后,最大字符串可为2G,但是我一开始没有定义@v_cmdstr2,就用了一个变量@v_cmdstr1,但是执行完之后发现数据库报错。之后对动态查询语句做了截断,动态部分用变量@v_cmdstr1 ,静态部分用了@v_cmdstr2,再执行就不报错了。但其实这时@v_cmdstr1 的长度仍然是>8000的,可见最大字符串可为2G并不是适用于所有场合。


沧海拾贝

下载本文
显示全文
专题