【发布时间】:2010-09-26 00:58:13
【问题描述】:
我正在尝试调试一个用 T-SQL UDF(不要问)编写的相当复杂的公式评估器,它递归地(但通过中间函数间接地)调用自身,等等。
当然,我们有一个错误。
现在,使用 PRINT 语句(然后可以通过实现 InfoMessage 事件的处理程序从 ADO.NET 读取),我可以模拟存储过程的跟踪。
对 UDF 执行相同操作会导致编译时消息:
Invalid use of side-effecting or time-dependent operator in 'PRINT' within a function.
我收到消息(PRINT 做了一些事情,比如重置 @@ROWCOUNT,这在 UDF 中绝对是一个禁忌,但是我如何跟踪调用?我想打印出这个跟踪,这样我就可以研究它了不会因为单步调试调试器中的调用而分心...
编辑:我尝试使用 SQL Profiler(这对我来说是第一次),但我不知道要跟踪什么:虽然我可以得到跟踪输出发送到数据库的查询,它们是不透明的,因为我无法深入到调用的 Expression-UDF:我可以跟踪调用的实际存储过程,但未列出此过程调用的 UDF。我错过了什么吗?估计不是……
编辑#2:尽管(自动)接受的答案确实会跟踪函数调用 - 非常有帮助,谢谢 - 它无助于找出 传递了哪些参数 到功能。当然,这对于调试递归函数是必不可少的。如果我找到任何解决方案,我会发布......
【问题讨论】:
-
是的,请查看下面 Matthieu 的答案,其中解释了您需要在 Profiler 设置中添加哪些事件。默认情况下,它只捕获一些事件,它们不是您进行故障排除所需的。
标签: tsql debugging trace user-defined-functions