我正在尝试执行一个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
答案 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
...你会得到截断的结果。