sql server 作業步驟的輸出考慮了什麼?
**簡而言之:**我的 SQL Server 作業歷史似乎只收到 PRINT 消息。有效歷史輸出的定義是什麼?
**背景:**只執行一個語句 like
UPDATE product SET ...
將不會在作業歷史中留下任何痕跡(無論是否選中“在歷史中包含步驟輸出”)。在查詢分析器中執行相同的語句顯示“(X 行受影響)”。通過創建一個變數並在更新後為其分配@@ROWCOUNT 內容,我可以建構並列印一條包含受影響行數的消息。這將包含在工作歷史中。這很好用,但我想知道 Transact-SQL 腳本作業步驟的輸出定義(寫入歷史記錄)。除了 PRINTed 字元串,還包括什麼?
人們可能很容易認為歷史將顯示與 SQL Server Management Studio 的查詢視窗(以前稱為查詢分析器)的消息窗格中顯示的完全相同 - 但事實並非如此。
對於 T-SQL 作業步驟,“輸出”指的是“消息”——通過
RAISERROR
。結果集也作為“輸出”包括在內,但前提是沒有RAISERROR
消息,否則只有RAISERROR
消息被包括在內。試試這個測試:
作業步驟 1
定義:
PRINT ' ** Line 1 ** '; SELECT ' ** Line 2 ** ' AS [Line Two]; RAISERROR(' ** Line 3 ** ', 10, 1);
工作歷史中的輸出:
消息
以使用者身份執行: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"
工作歷史中的輸出:
消息
以使用者身份執行:NT SERVICE\SQLSERVERAGENT。Line B-One
** Line B1 **
(1 行受影響)。這一步成功了。
作業步驟 3
定義:
PRINT ' ** Start ** '; RAISERROR(' ** Test Exception ** ', 16, 1); PRINT ' ** End ** ';
工作歷史中的輸出:
消息
以使用者身份執行:NT SERVICE\SQLSERVERAGENT。** 開始 **
$$ SQLSTATE 01000 $$(消息 0)** 測試異常 $$ SQLSTATE 42000 $$(錯誤 50000) 結束 **$$ SQLSTATE 01000 $$(消息 0)。步驟失敗。
關於問題中的以下陳述:
人們可能很容易認為歷史將顯示與“查詢”視窗的“消息”窗格中顯示的完全相同
$$ in SSMS $$ $$ for example: “(X row(s) affected)” $$
可能有人會這麼認為,但 SSMS 的 Messages 選項卡中顯示的內容不一定是 SQL Server 的直接輸出。SSMS 根據從 SQL Server 收到的資訊生成“受影響的 X 行”,這些資訊不是直接輸出,而是在表格數據流 (TDS) 中返回的附加資訊。這同樣適用於使用“GO x”的批次迭代,其中
x
是一個整數,告訴 SSMS 送出該特定批次的次數(以“GO”批次分隔符結尾的那個)。“消息”選項卡中的輸出將Beginning execution loop
在末尾顯示 和Batch execution completed 4 times.
,但這些是來自 SSMS 而不是來自 SQL Server 的消息。