nvarchar(max)的大小限制

时间:2013-08-13 08:55:19

标签: sql-server

我正在尝试执行一个sql查询字符串,该字符串在t-sql中有数千个字符。用于保存此查询的数据类型是nvarchar(max)。但使用这个我只能容纳67594个字符。但我的查询有更多的字符比这个。 有没有人知道为什么nvarchar(max)最多只能容纳67594个字符? nvarchar(max)最多可容纳2GB数据。不是吗?

我正在运行的程序是:

create procedure test
(
@snapshotid1 nvarchar(10),
@snapshotid2 nvarchar(10),
@version1 nvarchar(100),
@version2 nvarchar(100)
) AS DECLARE
@sql nvarchar(max),
@whereClause1 nvarchar(500),
@whereClause2 nvarchar(500),
@fromClause1 nvarchar(100),
@fromClause2 nvarchar(100)

BEGIN
set @sql = '';
set @sql = @sql + N'    
    select v1.v1_brand, version1total, version2total, version1total - version2total as varience from (
    select   "C - Brand" as v1_brand, 

    case ' + @period + ' when ''Jan'' then sum(Period1InvoicedAmount)
    when ''Feb'' then
.
.
.

END

问候

Subash Amara

1 个答案:

答案 0 :(得分:1)

无法重现。但!不要认为正确的TSQL连接不能处理大字符串。您的脚本中可能存在某个问题。这取决于你得到的错误。

这是一个可以运行的概念证明。

首先编写此脚本:

DECLARE @sql nvarchar(max) = ''
SET @sql = N'SELECT fld = newid()'

-- (PLACEHOLDER) --

SELECT DATALENGTH(@sql)

EXEC(@sql)

然后运行此脚本并复制行...

SELECT TOP 2000
  q = 'SET @sql = @sql + N''UNION ALL SELECT fld = newid()'''
FROM sys.syscolumns t1, sys.syscolumns t2

...并粘贴它而不是-- (PLACEHOLDER) --,所以你有......

DECLARE @sql nvarchar(max) = ''
SET @sql = N'SELECT fld = newid()'

SET @sql = @sql + N'UNION ALL SELECT fld = newid()'
SET @sql = @sql + N'UNION ALL SELECT fld = newid()'
...(totals 2000 lines)...
SET @sql = @sql + N'UNION ALL SELECT fld = newid()'

SELECT DATALENGTH(@sql)

EXEC(@sql)

执行此操作时,您将看到数据长度为120040(远高于67594)并且输出2001行。

但是,如果您尝试在SSMS中打印或选择动态创建的字符串,例如:

PRINT @sql
SELECT @sql

...你会得到截断的结果。