10

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

4

3 回答 3

12

是的,这是可能的- 根据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)数据类型如何不同并且不太适合较小的字符串 - 仅在真正需要时使用!

于 2012-12-25T12:11:31.547 回答
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 个变量

这应该可行,因为我有同样的问题

于 2019-08-24T10:18:25.527 回答
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。

于 2018-06-13T11:54:05.017 回答