“NVARCHAR(MAX) 截断仍然发生:了解隐式转换”
尽管现代 SQL Server 版本中存在 NVARCHAR(MAX) 的误解保存大量数据,用户可能会遇到像这样被截断到 4000 个字符的情况实例:
DECLARE @Query NVARCHAR(max); SET @Query = 'SELECT...' -- some of the query gets set here SET @Query = @Query + '...' -- more query gets added on, etc. -- later on... PRINT LEN(@Query) -- Prints out 4273, which is correct as far as I can tell PRINT @Query -- Truncates value to 4000 characters EXEC sp_executesql @Query -- totally crashes due to malformed (truncated) query
根本原因:隐式转换
问题源于隐式转换。将字符串与 Unicode 字符连接时,SQL Server 会自动将结果转换为 NVARCHAR(4000),而不发出警告或截断指示。即使声明用于存储结果的变量是 NVARCHAR(MAX),也会发生这种情况。
解决方案:强制显式转换
为了防止隐式转换并确保保留大的数据,始终使用 CAST 进行预连接:
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.
通过将空字符串转换为 NVARCHAR(MAX), SQL Server 被明确指示将整个字符串处理为 NVARCHAR(MAX)。这消除了截断问题。
其他注意事项
以上是为什么 NVARCHAR(MAX) 仍然截断 SQL Server 中的字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!