有关differences between compatibility level 80 and 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)
答案 0 :(得分:0)
您的单字符文字字符串仍然是nvarchar
,并且未声明为MAX
。按照documentation:
如果string_expression不是varchar(max)或nvarchar(max)类型,则REPLICATE将返回值截断为8,000个字节。要返回大于8,000个字节的值,必须将string_expression显式转换为适当的大值数据类型。
因此,您有一个nvarchar(1)
,它被复制了9000次。一旦拥有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
编辑:上面的代码还返回了一个无错误的截断值,因为它也是documented:
将字符或二进制表达式(二进制,char,nchar,nvarchar,varbinary或varchar)转换为其他数据类型的表达式时,转换操作可能会截断输出数据,而仅部分显示输出数据,否则返回错误。如果结果太短而无法显示,则会发生这些情况。 除下表中所示的转换外,到二进制,char,nchar,nvarchar,varbinary或varchar的转换将被截断。