sql-server - 对于以 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)
解决方案
您的单字符文字字符串仍然是 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 的转换被截断,下表中显示的转换除外。
推荐阅读
- python - 如何将软投票分类器应用于多标签分类
- reactjs - ButtonGroup 中的 IconButton 样式不稳定
- javascript - 移动 DApp 连接到钱包
- html - CSS 选择器 - 如何抓取所有元素
- python - TypeError:“_Printer”和“int”的实例之间不支持“>=”。想不通是什么意思
- php - 多个同时调用 exec 会阻止程序继续执行
- google-tag-manager - 谷歌标签管理器变量中的谷歌搜索关键字
- c - 创建一个以用户输入命名的 *.txt 文件
- python - 为什么我不能在 Steam 市场价格皮肤中进行 Web 抓取 python bs4
- php - 登录用户的PHP显示名称