是否可以以某种方式“回显”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)
PRINT()
是一件事,但听起来 DBA 出于某种原因没有给你那个输出。
RAISERROR()
,如下所示:
RAISERROR ('Message Here', 10,1) WITH NOWAIT
WITH NOWAIT
是因为 SQL Server 可能会批处理或缓冲输出。这有助于确保内容与脚本的其余部分按顺序讲述。
我认为如果您想查看消息,您有两种选择;
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,',')