我已经定义了一个具有类型参数的存储过程,并NVARCHAR(max)
在我的stored procedure
. 我知道最大值nvarchar
是 4000。但是我已经将一个包含 5700 个字符的字符串传递给我的 sp,没有任何错误。可能吗?
3 回答
是的,这是可能的- 根据MSDN 文档:
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 在内部将这些最大列存储到特殊结构中,这使得绕过 SQL Server 页面的 8K 限制成为可能。它可以工作——但它比仅仅在一个页面上存储几百个字节更费力,所以这个存储系统确实对 SQL Server 造成了更大的压力——小心使用它,只在你真正需要的时候使用它(而且绝对不要把你所有的专栏都写出来(n)varchar(max)
,只是因为你很懒!)
看看这篇关于 Simple Talk 的非常好的文章:再使用 VARCHAR(n) 有什么意义?- 它很好地解释了(max)
数据类型如何不同并且不太适合较小的字符串 - 仅在真正需要时使用!
你可以试试
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 个变量
这应该可行,因为我有同样的问题
如果你正在连接你的字符串,那么你必须像下面这样连接它。
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。