加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer 存储过程处理超长字符串问题

发布时间:2020-12-12 12:52:23 所属栏目:MsSql教程 来源:网络整理
导读:今天修改一个程序,报表部分在SQLServer用一个超级长的字符串来拼接数据查询条件,只加了一点点代码,就超过长度了,程序出错,找了好多资料,都没找到,自己试出来了。 1. 拼接的字符串,最初的同事使用:nvarchar(4000) 进行定义,这也是早期SQLServer所能

今天修改一个程序,报表部分在SQLServer用一个超级长的字符串来拼接数据查询条件,只加了一点点代码,就超过长度了,程序出错,找了好多资料,都没找到,自己试出来了。


1. 拼接的字符串,最初的同事使用:nvarchar(4000) 进行定义,这也是早期SQLServer所能容纳的最长字符串了。

2. 最初的修改:直接按新的SQLServer定义,设置成nvarchar(max)就能解决(两三年前)。

3. 问题出现: 今天本着完美的原则,看着觉得赋值使用 set 看起来更cool,更专业(心里变态,觉得好象比用 select 更专业),只是在新加的代码使用 set 进行赋值,然后再进行字符串拼接,程序出错。在存储过程中调试,发现 原始字符串有4068个字符,也超过了4000,可是,为毛会出错?找了好多资料,都不行,都是说什么 sp_tableoption 的,不一样的问题。

4. 问题解决: 折腾了个把小时,感觉应该不是字符超过4000的问题,可是,又找不到问题的原因(最初以为是表名不能包含:减号(-),冒号(:),点号(. ),试来试去,最终才定位到,超长字符赋值,只能用select ,直接用 select 替代 set,搞定收工。


代码示例:

1. 原代码就一些拼接:

? ?declare @cSQL nvarchar(max)

? ?select @cSQL = ' select ............ from XXXXX '

? ?select @cSQL = @cSQL + 报表查询条件

? ?exec?sp_executesql @cSQL

2. 因为要做一些特殊处理,所以要把结果先保存到临时表,就加了一点代码:

? ?declare @cSQL nvarchar(max)

? ?declare @cTmpTable nvarchar(50)

? ?set @cTmpTable ='tmp' + REPLACE( replace(replace(REPLACE( CONVERT(nvarchar(50),getdate(),121),'-',''),'.',':',' ','')?

? ?select @cSQL = ' select ............ from XXXXX '

? ?select @cSQL = ' select ............ into ' + @cTmpTable + ' from XXXXX '

? ?select @cSQL = @cSQL + 报表查询条件

? ?exec?sp_executesql @cSQL

3. 出错后,把 set 直接改为 select,问题就解决了。 ? ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读