2016-11-23 139 views
1

我使用了相当长的动态SQL语句(有点超过13000个字符),但是当我尝试执行它时,我注意到exec并没有完全读取语句并切割最后一部分关闭。动态SQL语句太长

我使用:

DECLARE @Statement nvarchar(max) 
SET @Statement = N'[LONG STATEMENT]' 
EXEC (@Statement) 

我也注意到,它可以读取甚至更少的字符,如果我不使用括号中EXEC (@Statement)

我也尝试使用EXEC sp_executesql @Statement 它只是停止读取12482个字符后的语句... 我遇到了SQL-Server 2008 R2和SQL Server 2014的问题

编辑:好的,现在我发现了一些不同的东西。看来,声明的长度本身并不完全是问题。正如我在下面的评论中提到的那样,我使用这个很长的动态sql语句,因为我正在创建一个更新脚本,它添加了一个新的存储过程,并且在此过程中我使用的表名可能不同。所以我创建了变量,其中包含表名,并将这些变量与动态sql语句一起使用,所以我不需要更改我使用此更新脚本添加的过程和函数中的表名,而只是更改了内容变量。但是,如果我不使用这些变量并在语句中使用表格名称“hardcoded”,则语句可以成功执行...

+0

如果你正在运行一个动态的SQL语句是长听起来可怕。什么是使用动态SQL的原因?你能不能把这个陈述分解成更小的陈述? – Tanner

+3

这个限制大约是2GB,所以这不是问题。你如何确定它的截断点?请注意,SSMS结果视图具有可配置的限制,因为它们将显示最大数据。 –

+1

*“我注意到,执行官没有完整地阅读陈述,并删除了最后一部分”* >>告诉我们你是如何得出这个结论的。 –

回答

4

我想答案就在这里:

所以我创建的变量,其中包含的表名和使用这些 变量与动态SQL语句,所以我并不需要改变 表名在我所添加的程序和函数 这个更新脚本中,但只是改变了变量的内容。

我猜你的动态T-SQL语句是使用字符串连接构建的。所以,让我们说我们有这样的事情:

DECLARE @DynamicSQLSTatement NVARCHAR(MAX); 

DECLARE @TableName01 NVARCHAR(128) = 'T01'; 
DECLARE @TableName02 NVARCHAR(128) = 'T02'; 

DECLARE @TSQL NVARCHAR(4000) = REPLICATE(N'X', 4000); 

SET @DynamicSQLSTatement = @TableName01 + @TSQL + @TableName02; 

我们有三个short字符串(长度< max)和它们被连接的时候,我们预计新NVARCHAR(MAX)值将是能够存储全新的字符串(毕竟,它的长度是max)。

那么,下面的说法会给出T02吧?

SELECT RIGHT(@DynamicSQLSTatement, 3); 

但是不,输出是XXX。所以,问题是为什么整个连接文本不被保存?

当您连接nvarchar(1-4000)字符串时,如果它们不能存储所有数据,则它们的输出字符串不会转换为max

为了解决这个问题,我们可以投字符串的第一部分nvarchar(max)

SET @DynamicSQLSTatement = CAST(@TableName01 AS NVARCHAR(MAX)) + @TSQL + @TableName02 

SELECT RIGHT(@DynamicSQLSTatement, 3); 
0

我想象你的打击限制约为16K(8K用于在你创建nvarchar(max)等变量之前,你可以保存最多的数据,你可以尝试使用varchar(max)而不是nvarchar,因为这将是一半的大小(unicode是16位,ascii是8位) 。我有一种感觉,虽然没有多大帮助

真的,虽然你遇到了这个问题,因为无论你想要做什么都不应该这样做,超长的SQL语句是一个标志你已经走上了错误的道路,找到一种方法来打破你的查询或操作,如果这是一个查询,请考虑你是否ld通过几个步骤而不是在一个查询中限制数据集。