我有一些动态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/