对于将nvarchar作为参数的内置函数,如果提供的值为varchar,则该值仍会转换为nvarchar(4000)

时间:2019-06-10 07:33:53

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

有关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)

1 个答案:

答案 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的转换将被截断