nvarchar(max) still being truncated
nvarchar(max) still being truncated
The problem is with implicit conversion.
If you have Unicode/nChar/nVarChar values you are concatenating, then SQL Server will implicitly convert your string to nVarChar(4000), and it is unfortunately too dumb to realize it will truncate your string or even give you a Warning that data has been truncated for that matter!
When concatenating long strings (or strings that you feel could be long) always pre-concatenate your string building with CAST('' as nVarChar(MAX)) like so:
SET @Query = CAST('' as nVarChar(MAX))--Force implicit conversion to nVarChar(MAX)
+ 'SELECT...'-- some of the query gets set here
+ '...'-- more query gets added on, etc.
What a pain and scary to think this is just how SQL Server works. :(
I know other workarounds on the web say to break up your code into
multiple SET/SELECT assignments using multiple variables, but this is
unnecessary given the solution above.
For those who hit an 8000 character max, it was probably because you had
no Unicode so it was implicitly converted to VarChar(8000).
Explanation:
What's happening behind the scenes is that even though the variable you
are assigning to uses (MAX), SQL Server will evaluate the right-hand
side of the value you are assigning first and default to nVarChar(4000)
or VarChar(8000) (depending on what you're concatenating). After it is
done figuring out the value (and after truncating it for you) it then
converts it to (MAX) when assigning it to your variable, but by then it
is too late.
Why Is My VARCHAR(MAX) Variable Getting Truncated?
Instead, I recommend casting a blank as VARCHAR(MAX) and prefixing it to the start of your variable string. Leave yourself a comment for the future and hopefully you'll remember why this superfluous looking piece of code is needed:
-- using CAST('') to force SQL to define
-- as varchar(MAX)
SET @dynamicQuery = CAST('' AS varchar(MAX))
+ REPLICATE('a',8000)+ 'b'
作者:Chuck Lu GitHub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-03-11 The view 'Index' or its master was not found.
2019-03-11 JMeter -- Getting Started
2019-03-11 237. Delete Node in a Linked List
2016-03-11 SuperSocket中的Server的初始化和启动
2016-03-11 SuperSocket中的Server是如何初Start的
2016-03-11 SuperSocket中的Server是如何初Initialize的