gpt4 book ai didi

sql-server - 动态 SQL 语句太长

转载 作者:行者123 更新时间:2023-12-01 06:19:57 24 4
gpt4 key购买 nike

我使用了很长的动态 SQL 语句(略多于 13000 个字符),但是当我尝试执行它时,我注意到 exec 没有完全读取语句并切断了最后一部分。

我在用:

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 语句一起使用,因此我不需要在使用此更新脚本添加的过程和函数中更改表名,而只需更改表名变量。
但是,如果我不使用这些变量并在语句中使用“硬编码”的表名,则该语句可以成功执行...

最佳答案

我想答案在这里:

So I created variables, which contain the table names and used these variables with the dynamic sql statement, so I don't need to change the table names within the procedures and functions I am adding with this update script, but just changing the content of the variables.



我猜,你的动态 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字符串 (length < max) 并且当它们连接时,我们期望新的 NVARCHAR(MAX) value 将能够存储整个新字符串(毕竟它的长度是 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);

关于sql-server - 动态 SQL 语句太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40763552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com