动态SQL语句太长

时间:2016-11-23 11:39:59

标签: sql-server tsql

我正在使用相当长的动态SQL语句(超过13000个字符)但是当我尝试执行它时,我注意到exec没有完全读取语句并且删除了最后一部分。 / p>

我正在使用:

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”,则该语句可以成功执行...

2 个答案:

答案 0 :(得分:6)

我想答案就在这里:

  

所以我创建了包含表名的变量并使用了这些变量   变量用动态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)值能够存储整个新字符串(它与{{{ 1}}长度,毕竟)。

那么,以下陈述将以max为准,对吧?

T02

但不,输出为SELECT RIGHT(@DynamicSQLSTatement, 3); 。那么,问题是为什么不保留整个连接文本?

当您连接XXX个字符串时,如果无法存储所有数据,则输出字符串不会转换为nvarchar(1-4000)

为了解决这个问题,我们可以将字符串的第一部分转换为max

nvarchar(max)

答案 1 :(得分:0)

我想象你达到了大约16K的限制(8K曾经是nvarchar(max)等发明之前你可以在变量中保存的最多数据。你可以尝试使用varchar(max)而不是nvarchar因为这将是一半大小(unicode是16位,ascii是8位)。我有一种感觉,虽然不会有多大帮助。

实际上,你正在解决这个问题,因为无论你想要做什么都不应该这样做,超长的SQL语句就是你已经失败的标志错误的道路。找到一种方法来分解您的查询或操作。如果这是一个查询,请考虑您是否可以通过几个步骤而不是一个查询来限制数据集。