Sql-Server

sql server 作業步驟的輸出考慮了什麼?

  • April 14, 2016

**簡而言之:**我的 SQL Server 作業歷史似乎只收到 PRINT 消息。有效歷史輸出的定義是什麼?

**背景:**只執行一個語句 likeUPDATE 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);

工作歷史中的輸出:

消息

以使用者身份執行: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 的消息。

引用自:https://dba.stackexchange.com/questions/135312