Sql server 动态SQL语句太长

Sql server 动态SQL语句太长,sql-server,tsql,Sql Server,Tsql,我使用了相当长的动态SQL语句(超过13000个字符),但当我试图执行它时,我注意到执行器没有完全读取语句,并将最后一部分截断 我正在使用: DECLARE @Statement nvarchar(max) SET @Statement = N'[LONG STATEMENT]' EXEC (@Statement) 我注意到,如果我不使用EXEC(@Statement) 我还尝试使用EXEC sp\u executesql@Statement 它只是在12482个字符后停止读取语句。。。 我有

我使用了相当长的动态SQL语句(超过13000个字符),但当我试图执行它时,我注意到执行器没有完全读取语句,并将最后一部分截断

我正在使用:

DECLARE @Statement nvarchar(max)
SET @Statement = N'[LONG STATEMENT]'
EXEC (@Statement)
我注意到,如果我不使用
EXEC(@Statement)

我还尝试使用
EXEC sp\u executesql@Statement
它只是在12482个字符后停止读取语句。。。 我有SQL Server 2008 R2和SQL Server 2014的问题

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

我可以想象,在nvarchar(max)等发明之前,变量中最多可以保存8K的数据。您可以尝试使用varchar(max)而不是nvarchar,因为这将是大小的一半(unicode是16位,ascii是8位)


实际上,你正在解决这个问题,因为无论你试图做什么,都不应该这样做,超长SQL语句是你走错了路的标志。找到一种方法来破坏你的查询或操作。如果这是一个查询,考虑是否可以通过几个步骤而不是在一个查询中限制数据集。.

我想答案是:

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

那么,下面的语句将给出
T02
,对吗

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

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

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


如果您运行的动态sql语句那么长,听起来很可怕。使用动态sql的理由是什么?您不能将该语句拆分为更小的语句吗?限制大约为2GB,所以这不是问题所在。您如何确定其截断点?请注意,SSMS结果视图具有可配置的限制作为最大限制嗯,他们将显示的数据。“我注意到执行官没有完全阅读语句,并将最后一部分切掉了”>>告诉我们您是如何得出这个结论的。如果您在SSMS中查看结果,那么它很可能会被截断。实际上不太可能截断数据,但是,这是SSMS中的一个显示限制。@Tanner我使用动态sql,因为我需要创建一个更新脚本,该脚本会创建一个相当长的新存储过程。但是存储过程使用的是表名,表名可能因运行该过程的系统而异。由于我不想在过程本身中每次都更改表名,所以我创建了变量,其中包含表名,并在创建过程的动态sql语句中使用它们错误消息说,它找不到标量变量,因为该变量的名称已被截断。
SET @DynamicSQLSTatement =  CAST(@TableName01 AS NVARCHAR(MAX)) + @TSQL + @TableName02

SELECT RIGHT(@DynamicSQLSTatement, 3);