首页 > 解决方案 > 对于以 nvarchar 作为参数的内置函数,如果提供的值为 varchar,则该值仍会转换为 nvarchar(4000)

问题描述

关于兼容级别 80 和 lLevel 90 之间差异的 MS 文档说的是兼容级别 90:

“对于以 nvarchar 作为参数的内置函数,如果提供的值为 varchar,该值仍会转换为 nvarchar(4000)。但是,如果传递了更大的值,SQL Server 2008 会产生错误。”

但是,当我在 SQL Server 2008 R2 中尝试它时,它总是被静默截断:

DECLARE @SQL VARCHAR(8000)

SET @SQL = REPLICATE(N'A', 9000) -- It's return 4000

SELECT LEN(@SQL)

标签: sql-serversql-server-2008-r2

解决方案


您的单字符文字字符串仍然是 anvarchar并且声明为 a MAX。根据文档

如果 string_expression 不是 varchar(max) 或 nvarchar(max) 类型,则 REPLICATE 将返回值截断为 8,000 字节。要返回大于 8,000 字节的值,必须将 string_expression 显式转换为适当的大值数据类型。

因此,您有一个nvarchar(1)被复制 9,000 次的。一旦你有 4,000 个字符,你就有 8,000 个字节,这样就达到了限制。如果你想要 8,000 个字符,你需要这样做:

DECLARE @SQL varchar(8000);

SET @SQL = REPLICATE(CONVERT(nvarchar(MAX), N'A'), 9000); 

SELECT LEN(@SQL); --Returns 8,000

编辑:上面还返回一个截断的值,没有错误,因为这也记录在案

将字符或二进制表达式(binary、char、nchar、nvarchar、varbinary 或 varchar)转换为不同数据类型的表达式时,转换操作可能会截断输出数据,仅部分显示输出数据,或返回错误。如果结果太短而无法显示,就会出现这些情况。到 binary、char、nchar、nvarchar、varbinary 或 varchar 的转换被截断,下表中显示的转换除外。


推荐阅读