SQL Server如何在NVARCHAR(最大)中存储超过4000个字符?

时间:2012-12-25 12:04:44

标签: sql-server stored-procedures nvarchar

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

3 个答案:

答案 0 :(得分:7)

是的可能 - 根据MSDN documentation

  

nvarchar [(n | max)]

     

可变长度的Unicode字符串数据。 n定义字符串长度,可以是1到4,000之间的值。 max表示最大存储大小为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)数据类型如何不同而不太适合较小的字符串 - 仅在真正需要时使用!

答案 1 :(得分:0)

如果要对字符串进行汇总,则必须按以下方式进行汇总。

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。

答案 2 :(得分:0)

您可以尝试

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个变量。

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

相关问题