SQL Server 在运行长脚本时“回显”[重复]

问题描述 投票:0回答:2

是否可以以某种方式“回显”SQL Server 中 SQL 脚本中的消息,以便将它们记录在执行日志中?

由于强大的安全策略,开发人员只能在开发环境中运行数据库脚本,并且可以立即看到结果。

但是,要在测试、登台或生产数据库中执行更改,他们需要提交 SQL 脚本,对其进行审查、批准并最终运行。一旦它们运行,DBA 就会发送一个执行日志,如下所示:

(12 rows affected)
(1 row affected)
(141 rows affected)
Msg 8114, Level 16, State 5, Line 21
Error converting data type varchar to bigint.
(5 row affected)
(1 row affected)

在上面的示例中,执行了 6 个查询,很容易看出第四个查询有问题。在这个小集合中,很容易在原始脚本中找到错误的查询。

当脚本上运行 250 个查询时,这不再容易了。有没有办法在日志中包含消息,例如“步骤#1完成”,如下所示:

(12 rows affected)
(1 row affected)
-- Step #1 complete
(141 rows affected)
Msg 8114, Level 16, State 5, Line 21
Error converting data type varchar to bigint.
(5 row affected)
-- Step #2 complete
(1 row affected)
sql sql-server logging scripting
2个回答
1
投票

PRINT()
是一件事,但听起来 DBA 出于某种原因没有给你那个输出。

相反,您可以尝试使用良性错误级别的

RAISERROR()
,如下所示:

 RAISERROR ('Message Here', 10,1) WITH NOWAIT

WITH NOWAIT
是因为 SQL Server 可能会批处理或缓冲输出。这有助于确保内容与脚本的其余部分按顺序讲述。


0
投票

我认为如果您想查看消息,您有两种选择;

1)PRINT -> 您可以使用此命令打印消息

2)RAISERROR() -> 在正常情况下,此函数用于引发异常,但如果您在文本级别,那么您可以看到诸如打印之类的消息。

raiseerror 示例 ->

RAISERROR('Some Message',10,1) WITH NOWAIT

注意水平。 10 为普通文本,16 为错误,如果使用大于 20 的值,可能会导致 SQL Serve 关闭,所以要小心。

如果您需要日志,则步骤 1 已完成等。您可以将步骤记录在表/临时表中,或者您可以声明一个变量推送您的日志并返回它(如果有)。

此外,您还可以创建一个 try-catch 结构,这样您就可以看到哪一步失败了,并且可以逐步修复它。日志可以是你的脚步声,即使有一些异常,如果你返回日志,你就可以看到你在做什么。

示例;

DECLARE @stepLOgs nvarchar(max) = N''

BEGIN TRY
    SELECT 1
    SET @stepLogs = @stepLogs + 'Step1 Success'
    SELECT 2
    SET @stepLogs = @stepLogs + 'Step2 Success'
    SELECT 5/0
    SET @stepLogs = @stepLogs + 'Step3 Success'
END TRY
BEGIN CATCH
    SET @stepLogs = @stepLogs + 'Exception Caught'
END CATCH

SELECT * FROM string_split(@stepLogs,',')
© www.soinside.com 2019 - 2024. All rights reserved.