我正在尝试调试一个用 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:尽管(自动)接受的答案确实跟踪了函数调用 - 非常有帮助,谢谢 - 它无助于找出传递给函数的参数。当然,这对于调试递归函数是必不可少的。如果我找到任何解决方案,我会发布...