在 SQL Server 2008 中调试长动态 sql

标签 debugging sql-server-2008 dynamic-sql

我有一些动态sql语句在某些条件下会崩溃,所以我正在尝试调试它。它的构建方式如下:

declare @sql varchar(4000);
...
select @sql = '<part1>';
...
select @sql = @sql + '<part2>';
...
select @sql = @sql + '<part3>';
...
begin 
execute(@sql);
select @ec__errno = @@error
    if @ec__errno != 0
    begin
    if @@trancount != 0
    begin
    rollback;
    end
return @ec__errno;
end;
... 

正如我所说,它在循环的特定迭代中爆炸(不要问我为什么这样实现,我只是修复一个错误)并且我很难在中显示字符串的内容一个观察窗。我想我只得到前 255 个字符。监视 substring(@sql, 0, 200) 会导致无法评估“substring(@sql,0,200)”。请帮忙。我希望观察从 0 到 199、从 200 到 399 等等的子字符串,然后将这个东西拼凑在一起,最后进行调试。

非常感谢您的指点。谢谢!

最佳答案

当被迫在存储过程中使用动态 SQL 时,我们执行以下操作。添加一个 debug 输入变量,它是一个位字段。如果它是 0,则 exec 语句将继续执行;如果它是 1,那么您将得到一条 print 语句。我建议你做一些类似的调试。不要执行,而是打印 SQL 的结果,或者可能将 SQl 插入到表中,因为它似乎是在循环中发生的。然后你可以查看构建的sql,看看哪里出了问题。

Declare debug bit
set debug = 1

...
if debug = 1 Begin     Print @SQL End
Else 
Begin Exec (@sql) End

或者

创建一个名为mydynamiccode_logging的表(其中一个sql列的长度与最大sql语句相同,一个rundate列以及您可能认为必要的任何其他列(我会考虑用于组成sql语句的输入变量,用户,如果多个应用程序使用这段代码)

在运行 exec 语句之前,运行如下所示的代码:

insert mydynamiccode_logging (sql, rundate)
values (@sql, getdate()) 

现在您还可以添加调试位字段,并且仅在将其更改为 Debug模式时才记录,或者您可以始终记录,具体取决于系统以及这需要多少额外时间以及对系统其余部分的影响程度是。您不想通过日志记录来显着减慢生产速度。

关于在 SQL Server 2008 中调试长动态 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359354/

相关文章:

html - 可以在 Mac、PC 或其他设备上镜像 iOS Safari 调试控制台吗?

sql-server - SQL Server 2008 数据库镜像疯狂

c# - 使用 C# 中的 SQL Server 存储过程插入 NULL DateTime

postgresql - 此处不支持通过 "*"进行行扩展

sql - 从 PostgreSQL 表中提取特定列并对其值进行更新

python - Jupyter、Python、%调试 : Setting breakpoint in module doesn't work

.net - 简单的 WCF 调用需要很多时间

c++ - 条件断点在不应触发时触发

sql - 我想要小时,分钟,两个日期时间的第二个差异

MySql 分配变量时出错