如何解决动态查询语句太长,大于数据库字符的最大长度
2013-06-17 18:49
393 查看
上周,在写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并不是适用于所有场合。
本文出自 “沧海拾贝” 博客,请务必保留此出处http://angeljing.blog.51cto.com/7370594/1223777
未解决此问题,找到了定义变量的长度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并不是适用于所有场合。
本文出自 “沧海拾贝” 博客,请务必保留此出处http://angeljing.blog.51cto.com/7370594/1223777
相关文章推荐
- [转载]如何处理含有特殊字符的数据库查询语句
- 如何处理含有特殊字符的数据库查询语句
- ResGen.exe 可能无法运行,因为命令行的长度为XX个字符,超过了命令的最大长度。若要解决此问题,请 (1) 删除不需要的程序集引用,或者 (2) 缩短这些引用的路径。
- 如何在sql/plus中把select语句查询显示出来的结果中的显示字段长度缩小
- MyBatis拦截器动态修改SQL语句及参数值(场景:查询中字段值中特殊字符自动转义)
- 一步一步优化你的mysql------如何优化数据库中的查询语句(一)
- 在写入数据库的时候,某字段varchar(20),报“字符长度超长”的错误,但是去数据库中用length()查,发现最大的长度都不超20,为什么会报这个错呢?
- Oracle报错:类型长度大于最大值解决办法
- Hibernate SQL常量的查询语句时,只返加第一个字符的解决方式
- 如何用SQL语句,查询数据库(日期+时间字段)中等于某一天的记录
- 跨服务器,跨数据库,多表联合查询 / 如何用sql语句来查询表中哪些记录是重复的
- TP 查询时候标题带有&的字符,查询没有结果!打出SQL语句去数据库查,返回有结果!
- 【连载】关系型数据库是如何工作的?(18) - 查询管理器之动态编程
- 数据库查询过程中条件过多如何解决?
- 数据库查询语句 动态加入查询条件 不区分大小写
- 查询语句自动增加序列号、获取字段长度、返回字符在字段中的位置信息、从第几个位置替换字符串
- 【转】如何解决plsql查询oracle数据库语句where条件带有中文无法匹配结果
- sql: 去除数据库表中tab、空格、回车符等特殊字符的解决方法 去除tab、空格、回车符等使用replace语句 按照ASCII码, SELECT char(64) 例如64 对应 @,则se
- 关于mybatis的动态if语句查询报错问题和解决方法
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。【转】