我已经定义了一个类型为NVARCHAR(max)
的参数的存储过程,我在stored procedure
中处理该字符串。我知道nvarchar
的最大值是4000.但是我已经将一个包含5700个字符的字符串传递给了我的sp而没有错误。有可能吗?
答案 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个变量。
这应该可行,因为我遇到了同样的问题