【问题标题】:How does SQL Server store more than 4000 characters in NVARCHAR(max)?SQL Server 如何在 NVARCHAR(max) 中存储超过 4000 个字符?
【发布时间】:2012-12-25 12:04:43
【问题描述】:

我已经定义了一个具有NVARCHAR(max) 类型参数的存储过程,并在我的stored procedure 中处理该字符串。我知道nvarchar 的最大值为 4000。但我已将一个包含 5700 个字符的字符串传递给我的 sp,没有任何错误。有可能吗?

【问题讨论】:

  • NVARCHAR(MAX) 可以存储超过 2 GB 的数据。请参考这个答案stackoverflow.com/questions/12639948/…
  • 根据this nvarchar [ ( n | max ) ] 变长Unicode字符串数据。 n 定义字符串长度,可以是 1 到 4,000 之间的值
  • @breceivemail:如果您在链接到的页面上阅读,它还会显示:max 表示最大存储大小为 2^31-1 字节(2 GB)。

标签: sql-server stored-procedures nvarchar


【解决方案1】:

是的,这是可能的 - 根据MSDN documentation

nvarchar [ ( n | max ) ]

可变长度的 Unicode 字符串数据。 n 定义字符串长度,可以是 1 到 4,000 之间的值。 ma​​x 表示最大存储大小为 2^31-1 字节(2 GB)。 存储大小(以字节为单位)为实际输入数据长度的两倍 + 2 字节。 nvarchar 的 ISO 同义词是国家字符变化和国家字符变化。

因此,如果您指定 nvarchar(max),您最多可以存储 10 亿 个 2 字节 Unicode 字符。那是列夫·托尔斯泰 (Leo Tolstoj) 的战争与和平的一百多倍......

SQL Server 将这些 max 列存储在内部的特殊结构中,这使得绕过 SQL Server 页面的 8K 限制成为可能。它可以工作 - 但它比仅仅在一个页面上存储几百个字节更费力,所以这个存储系统确实对 SQL Server 造成了更大的压力 - 小心使用它,只有当你真的需要时才使用它(而且绝对不要仅仅因为你懒惰而把你所有的专栏都写成(n)varchar(max)!)

查看关于 Simple Talk 的这篇非常好的文章:What's the Point of Using VARCHAR(n) Anymore? - 它很好地解释了 (max) 数据类型的不同之处,并且不太适合较小的字符串 - 仅在真正需要时使用!

【讨论】:

    【解决方案2】:

    如果你要连接你的字符串,那么你必须像下面这样连接它。

    DECLARE @qry NVARCHAR(MAX);
    
    SET @qry = N'SELECT * FROM Table1 t1';
    SET @qry = @qry + N'INNER JOIN Table2 t2 ON t1.Col1 = t2.Col2'
    SET @qry = @qry + N'INNER JOIN Table3 t3 ON t1.Col1 = t2.Col3'
    
    EXEC sp_executeSQL @qry
    

    在上面的例子中,即使连接字符串的字符超过 4000 个字符,它也会被添加到变量中,并且限制为 2GB。

    【讨论】:

      【解决方案3】:

      你可以试试

      Declare @SQL as nvarchar(Max)
          ,@SQL2 as nvarchar(Max)
      
      -- Just Sample
      -- each variable max 4000 character, so be wise in splitting your syntax
      
      Set @SQL  = 'Select * '
      Set @SQL2 = 'From table A'
      
      EXEC (@SQL+@SQL2)
      

      请注意,如果您的动态字符串长度超过 > 8000 个字符,则应拆分为 3 个变量'

      这应该可行,因为我遇到了同样的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-24
        • 2012-05-13
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 2010-11-25
        • 2011-01-22
        • 2015-03-07
        相关资源
        最近更新 更多