And*_*son 7 sql-server sql-server-2012 sql-server-agent jobs
简而言之:似乎我只收到了 SQL Server 作业历史记录的 PRINT 消息。有效历史输出的定义是什么?
背景:只执行一条像这样的语句UPDATE product SET ...不会在作业历史中留下任何痕迹(无论是否选中“在历史中包含步骤输出”)。在查询分析器中运行相同的语句显示“(X 行受影响)”。
通过创建一个变量并在更新后为它分配@@ROWCOUNT 内容,我可以构建和打印一条包含受影响行数的消息。这将包含在工作历史中。这工作正常,但我想知道Transact-SQL 脚本作业步骤的输出定义(写入历史记录)。除了 PRINTed 字符串之外还包括什么?
人们可能很容易认为历史记录会与 SQL Server Management Studio 的“查询”窗口(以前称为“查询分析器”)的“消息”窗格中显示的完全相同——但事实并非如此。
对于 T-SQL 作业步骤,“输出”指的是“消息”——通过PRINT和发送的通知RAISERROR。结果集也作为“输出”包含在内,但前提是没有PRINT/RAISERROR消息,否则仅包含PRINT/RAISERROR消息。
试试这个测试:
工作步骤 1
定义:
PRINT ' ** Line 1 ** ';
SELECT ' ** Line 2 ** ' AS [Line Two];
RAISERROR(' ** Line 3 ** ', 10, 1);
Run Code Online (Sandbox Code Playgroud)
作业历史输出:
消息
以用户身份执行:NT SERVICE\SQLSERVERAGENT。** 第 1 行 ** [SQLSTATE 01000](消息 0) ** 第 3 行 ** [SQLSTATE 01000](消息 50000)。步骤成功了。
工作步骤 2
定义:
SELECT ' ** Line B1 ** ' AS [Line B-One];
--PRINT ' ** Line B2 ** '; -- uncomment and output will show this and not "Line B1"
Run Code Online (Sandbox Code Playgroud)
作业历史输出:
消息
以用户身份执行:NT SERVICE\SQLSERVERAGENT。Line B-One
---------------
** Line B1 **
(1 行受影响)。步骤成功了。
工作步骤 3
定义:
PRINT ' ** Start ** ';
RAISERROR(' ** Test Exception ** ', 16, 1);
PRINT ' ** End ** ';
Run Code Online (Sandbox Code Playgroud)
作业历史输出:
消息
以用户身份执行:NT SERVICE\SQLSERVERAGENT。** 开始 ** [SQLSTATE 01000](消息 0) ** 测试异常 ** [SQLSTATE 42000](错误 50000) ** 结束 ** [SQLSTATE 01000](消息 0)。步骤失败。
关于问题中的以下陈述:
人们可能很容易认为历史记录将显示与查询窗口的消息窗格中显示的完全相同 [在 SSMS 中] [例如:“(X 行受影响)”]
肯定有人会这么认为,但是 SSMS 的“消息”选项卡中显示的内容不一定是 SQL Server 的直接输出。“受影响的 X 行”是由 SSMS 根据它从 SQL Server 收到的信息生成的,这些信息不是直接输出,而是在表格数据流 (TDS) 中返回的附加信息。这同样适用于使用“GO x”的批处理迭代,其中x是一个整数,告诉 SSMS 提交该特定批处理的次数(以“GO”批处理分隔符结尾的那个)。“消息”选项卡中的输出会Beginning execution loop在最后显示和Batch execution completed 4 times.,但这些是来自 SSMS 而不是来自 SQL Server 的消息。