1

我正在尝试执行一个在 t-sql 中有数千个字符的 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

问候

苏巴什·阿马拉

4

1 回答 1

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

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

于 2013-08-13T09:31:29.867 回答