用T-SQL调试输出



在调试T-SQL时,是否有像Javascript的alert();函数或console.log这样的东西,我可以在测试和调试SQL脚本或存储过程时使用输出值?

是的,它叫PRINT。在这里看到的:

http://msdn.microsoft.com/en-us/library/ms176047.aspx

您可以使用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

最新更新