Sql server nvarchar的尺寸限制(最大值)

Sql server nvarchar的尺寸限制(最大值),sql-server,Sql Server,我正在尝试执行一个sql查询字符串,该字符串在t-sql中有数千个字符。用于保存此查询的数据类型为nvarchar(max)。但是用这个我只能容纳67594个字符。但是我的查询包含的字符比这个多。 有人知道为什么nvarchar(max)最多只能容纳67594个字符吗?nvarchar(最大)应能容纳高达2GB的数据。不是吗 我正在运行的过程是: create procedure test ( @snapshotid1 nvarchar(10), @snapshotid2 nvarchar(10

我正在尝试执行一个sql查询字符串,该字符串在t-sql中有数千个字符。用于保存此查询的数据类型为nvarchar(max)。但是用这个我只能容纳67594个字符。但是我的查询包含的字符比这个多。 有人知道为什么nvarchar(max)最多只能容纳67594个字符吗?nvarchar(最大)应能容纳高达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
问候


亚鱼不能繁殖。但是不要认为正确的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
…并粘贴它而不是
-(占位符)-->
,这样您就可以

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

…您将得到截断的结果。

无法复制。但是不要认为正确的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
…并粘贴它而不是
-(占位符)-->
,这样您就可以

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

…您将得到截断的结果。

重复检查此项。很抱歉,这与上述主题不完全相同。我只连接nvarchar(max)字符串。所以它不应该被截断。重复的检查这个抱歉这不是完全重复的上述主题。我只连接nvarchar(max)字符串。所以它不应该被截断。