在调试T-SQL时,是否有像Javascript的alert();
函数或console.log
这样的东西,我可以在测试和调试SQL脚本或存储过程时使用输出值?
是的,它叫PRINT
。在这里看到的:
您可以使用PRINT将消息输出到日志,但我个人更喜欢使用低严重性的RAISERROR,因为PRINT输出并不总是立即打印到屏幕上。特别是在长时间运行的SP中。另一方面,像这样的代码会立即打印出来:
RAISERROR ('My Message', 10, 1)
不要被ERROR这个名字所迷惑,级别为10的错误并不会造成伤害。
至于CTE,我认为您在自引用公共表表达式方面存在问题。但是你应该知道,没有办法在递归CTE的执行中插入PRINT语句。
为了调试这些,我通常在结果集中添加一个额外的"迭代索引"列,该列随每次迭代递增。还有一些其他的专栏来帮助评估情况。当与结果集的其余部分一起检查时,它通常会提供很好的洞察力。就像IDX冷却下来一样。其他专栏帮助我检查连接条件,看看哪里出了问题:
WITH x AS (
SELECT 1 AS IDX, A._ID as ID_A, NULL as ID_B
FROM MYTABLE A
WHERE A._ID = 6
UNION ALL
SELECT X.IDX + 1, A._ID, B._ID
FROM MYTABLE B INNER JOIN X ON B._ID = X._ID + 1
WHERE B._ID < 20
)
SELECT *
FROM X
我使用带有" with NOWAIT"提示的"RAISERROR"指令,如下所示:
RAISERROR('My message here', 10, 1) WITH NOWAIT
PRINT语句有帮助。我有时将调试输出插入到表中,而不是将PRINT输出输出到结果窗格。
新版本的SQL(2008和2008R2)有调试选项。虽然不如在Visual Studio中调试c#项目那么可靠,但也相当不错。您可以一步一步地去,也可以创建可变的watchlist