什么时候 nvarchar(Max) = nvarchar(4000)?

Geo*_*tis 7 t-sql sql-server nvarchar

SO 和其他网站上有多个帖子明确指出了最大长度nvarchar(max)为 2GB。然而,我在互联网和现实生活中也看到了很多混乱,它实际上是 Unicode 中的 8000/4000。

我想知道什么事情可以改变这个事实,或者可能导致某人错误地假设这一点。

我已经收集的一些建议/部分答案:

  1. 是否有旧的 SQL Server 版本仅支持最多 4000 个?
  2. 当将nvarchar(max)变量/列分配给非最大尺寸组件的串联时,我们必须将所有内容都nvarchar(max)显式转换吗?下面展示了一个奇怪的示例,其中文本返回函数需要转换,而文字的 N 可以省略:

    declare @s nvarchar(max) 
    select @s = convert(nvarchar(max), replicate('.', 8000)) + N'Hi!'
    select len(@s) -- returns 8003
    
    declare @s nvarchar(max) 
    select @s = replicate('.', 8000) + N'Hi!' 
    select len(@s) -- returns 4000
    
    declare @s nvarchar(max) 
    select @s = convert(nvarchar(max), replicate('.', 8000)) + 'Hi!' 
    select len(@s) -- returns 8003
    
    Run Code Online (Sandbox Code Playgroud)
  3. 有办法禁用该功能吗?与此有sp_tableoption @OptionName=large value types out of rowOBJECTPROPERTY(id,'TableTextInRowLimit')有什么关系吗?

    澄清:我的目的不是使用此功能,而是要注意它的存在,它可能确实已被更高权限的用户使用,这将阻止使用最大大小。

  4. 如有任何其他观点欢迎

use*_*983 9

这里有几点,因为我无法发表评论。

  1. 是的。(n)varchar(MAX)在 SQL Server 2005 中引入的。以前您必须使用textntextimagefor varchar(MAX)nvarchar(MAX)varbinary(MAX)。旧数据类型已被弃用很长时间,您不应该使用它们。
  2. 组合数据时,数据类型优先级用于计算最终数据类型。当涉及长度时,将使用长度的组合值(Avarchar(10)varchar(100)连接将返回 .varchar(110)但请注意,要实现MAX长度的使用,至少一个字符串必须是(n)varchar(MAX).SELECT REPLICATE(N'A',3000) + REPLICATE(N'A',3000) AS S会返回 4000 个字符的字符串。+(字符串连接)(Transact-SQL) - 备注

    如果字符串连接的结果超过 8,000 字节的限制,结果将被截断。但是,如果连接的字符串中至少有一个是大值类型,则不会发生截断。

  3. 禁用什么功能?的用法(n)varchar(MAX)?为什么?如果您想阻止人们使用某种数据类型,请阻止他们使用(n)textimage。但严肃地说,您无法停止数据类型的使用。也许您可以通过 DDL 触发器变得“聪明”,但我建议不要这样做。

    要回答编辑,sp_tableoption不能用于阻止某人使用MAX长度数据类型 no;我的上述观点成立。引用文档( s ​​p_tableoption (Transact-SQL) - Arguments

    行外大值类型:
    1 = varchar(max)nvarchar(max)varbinary(max)xml表中的大型用户定义类型 (UDT) 列存储在行外,并有一个指向根的 16 字节指针。

    0 = varchar(max)nvarchar(max)varbinary(max)xml大 UDT 值直接存储在数据行中,最多限制为 8000 字节,并且只要该值可以容纳在记录中即可。如果记录放不下该值,则指针将存储在行内,其余部分将存储在 LOB 存储空间的行外。0 是默认值。

    大型用户定义类型 (UDT) 适用于:SQL Server 2008 到 SQL Server 2017。

    使用TEXTIMAGE_ON选项CREATE TABLE指定大型数据类型的存储位置。

  4. 对于SO来说太宽泛了。