FIX: T-SQL 批次中的 RAISERROR 陳述式的呼叫會造成 SQLAgent 工作失敗,並會遺失在 SQL Server 中的輸出

文章翻譯 文章翻譯
文章編號: 309802 - 檢視此文章適用的產品。
重要本文包含有關如何修改登錄的資訊。請確定您修改之前備份登錄。如果發生問題,請確定您知道如何還原登錄。如何備份、 還原,及修改登錄的相關資訊,請按一下下列的文件編號,檢視 Microsoft 知識庫中的文件:
256986Microsoft Windows 登錄的描述
全部展開 | 全部摺疊

在此頁中

徵狀

當 SQLAgent 作業步驟的類型是 Transact-SQL 指令碼以及新增 作業步驟-< SQL Server 執行個體名稱 > 的 [命令] 欄位中陳述式 方塊呼叫 Transact-SQL RAISERROR 陳述式與嚴重性 11 的層級或更高版本不使用 WITH 記錄選項] 對話方塊,工作將會結束與失敗的結果。不過,雖然所有 RAISERROR 陳述式之後執行 Transact-SQL 陳述式呼叫執行時,會隱藏所有輸出。 因此,不會產生輸出的陳述式之後 [RAISERROR 陳述式執行。這真的會造成混淆的相關作業中陳述式發生了什麼事。如果您想要看到什麼實際上已經執行,您必須先查看 SQL Profiler 追蹤。如需有關 SQL Profiler 追蹤的詳細資訊,請參閱 SQL Server 線上叢書 》 中的 < SQL Profiler 」 主題]。

解決方案

警告如果您修改登錄不當使用 「 登錄編輯程式 」,或使用另一個方法,可能會發生嚴重的問題。這些問題可能會要求您重新安裝作業系統。Microsoft 無法保證可以解決這些問題。您必須自己承擔修改登錄所造成的風險。

服務套件資訊

如果要解決這個問題,取得最新的 Service Pack,Microsoft SQL Server 2000。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
290211如何取得最新的 SQL Server 2000 Service Pack

Hotfix 資訊

此 Hotfix 的英文版在檔案屬性 (或更新版本的檔案屬性) 如下列表格中所列。這些檔案的日期和時間為 Coordinated Universal Time (UTC)。當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用 [中日期] 和 [時間] 工具,在 [控制台] 中的 [時區] 索引標籤]。
   Date         Time   Version         Size       File name
   -------------------------------------------------------------------
   31-May-2003  05:15  2000.80.818.0      78,400  Console.exe
   27-Oct-2003  14:51  2000.80.873.0     315,968  Custtask.dll
   30-Jan-2004  02:59  2000.80.911.0      33,340  Dbmslpcn.dll
   24-Apr-2003  12:42                    786,432  Distmdl.ldf
   24-Apr-2003  12:42                  2,359,296  Distmdl.mdf
   29-Jan-2003  12:25                        180  Drop_repl_hotfix.sql
   11-Sep-2003  13:56  2000.80.859.0   1,905,216  Dtspkg.dll
   26-Aug-2003  06:46  2000.80.854.0     528,960  Dtspump.dll
   23-Jun-2003  09:10  2000.80.837.0   1,557,052  Dtsui.dll
   23-Jun-2003  09:10  2000.80.837.0     639,552  Dtswiz.dll
   23-Apr-2003  13:21                    747,927  Instdist.sql
   02-May-2003  12:26                      1,581  Inst_repl_hotfix.sql
   30-Jan-2004  02:59  2000.80.911.0      90,692  Msgprox.dll
   31-Mar-2003  12:37                      1,873  Odsole.sql
   30-Jan-2004  02:59  2000.80.911.0      62,024  Odsole70.dll
   30-Jan-2004  02:59  2000.80.911.0      25,144  Opends60.dll
   30-Jan-2004  02:59  2000.80.911.0      57,904  Osql.exe
   02-Apr-2003  09:45  2000.80.797.0     279,104  Pfutil80.dll
   04-Aug-2003  04:47                    550,780  Procsyst.sql
   11-Sep-2003  11:07                     12,305  Qfe469315.sql
   22-May-2003  09:27                     19,195  Qfe469571.sql
   29-Jan-2004  11:47                  1,090,380  Replmerg.sql
   30-Jan-2004  02:59  2000.80.911.0     221,768  Replprov.dll
   30-Jan-2004  02:59  2000.80.911.0     307,784  Replrec.dll
   29-Jan-2004  09:54  2000.80.911.0     159,813  Replres.rll
   05-Sep-2003  10:30                  1,087,150  Replsys.sql
   13-Aug-2003  02:58                    986,603  Repltran.sql
   30-Jan-2004  02:59  2000.80.911.0     287,304  Rinitcom.dll
   30-Jan-2004  02:59  2000.80.911.0      57,916  Semnt.dll
   29-Jul-2003  06:43  2000.80.819.0     492,096  Semobj.dll
   31-May-2003  04:57  2000.80.818.0     172,032  Semobj.rll
   02-Jan-2004  06:12  2000.80.904.0      53,832  Snapshot.exe
   09-Dec-2003  06:37                    117,834  Sp3_serv_uni.sql
   04-Feb-2004  11:16  2000.80.913.0      28,672  Sqlagent.dll
   04-Feb-2004  11:17  2000.80.913.0     311,872  Sqlagent.exe
   07-Jan-2004  09:08  2000.80.905.0     126,976  Sqlakw32.dll
   30-Jan-2004  02:59  2000.80.911.0   4,215,360  Sqldmo.dll
   07-Apr-2003  04:14                     25,172  Sqldumper.exe
   29-Jan-2004  09:47  2000.80.911.0      28,672  Sqlevn70.rll
   30-Jan-2004  02:59  2000.80.911.0     180,792  Sqlmap70.dll
   02-Sep-2003  13:26  2000.80.857.0     188,992  Sqlmmc.dll
   02-Sep-2003  09:33  2000.80.857.0     479,232  Sqlmmc.rll
   21-Oct-2003  10:38  2000.80.871.0     401,984  Sqlqry.dll
   30-Jan-2004  02:59  2000.80.911.0      57,920  Sqlrepss.dll
   04-Feb-2004  11:18  2000.80.913.0   7,610,449  Sqlservr.exe
   30-Jan-2004  02:59  2000.80.911.0     590,396  Sqlsort.dll
   30-Jan-2004  02:59  2000.80.911.0      45,644  Sqlvdi.dll
   30-Jan-2004  02:59  2000.80.911.0     106,588  Sqsrvres.dll
   30-Jan-2004  02:59  2000.80.911.0      33,340  Ssmslpcn.dll
   30-Jan-2004  02:59  2000.80.911.0      82,492  Ssnetlib.dll
   30-Jan-2004  02:59  2000.80.911.0      25,148  Ssnmpn70.dll
   27-Oct-2003  14:51  2000.80.873.0     123,456  Stardds.dll
   30-Jan-2004  02:59  2000.80.911.0     158,240  Svrnetcn.dll
   30-Jan-2004  02:59  2000.80.911.0      76,416  Svrnetcn.exe
   30-Apr-2003  10:22  2000.80.816.0      45,132  Ums.dll     
   30-Jan-2004  02:59  2000.80.911.0      98,872  Xpweb70.dll
附註由於檔案相依性最新版 Hotfix 或包含這些檔案的功能也可能包含其他檔案。

套用此 Hotfix 之後,SQL Server 代理程式的行為是由新的登錄 DWORD 值,稱為 TruncateJobResultOnError 下列登錄子機碼的其中一所定義:
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SQLServerAgent (default instance)
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\SQLServerAgent (named instance)
若要以便新的行為設定這個 TruncateJobResultOnError 值為 0。重新啟動 SQL Server 代理程式 」 後作業結果將不再會 raiserror 陳述式被截斷。若要還原舊版的行為,您可以將 TruncateJobResultOnError 值設定為 1。如果不設定值,這會是預設值。

警告值變更為 0 時,所擲回的錯誤有無限迴圈的指令碼,可能不是有效的方法。代理程式持續記錄錯誤,可能會使用所有的磁碟空間。

其他可行方案

如果要解決此問題,使用 [其中下列方法依據您的需求]。

方法 1

決定您想要使用嚴重性等級
  • 如果要為資訊用途呼叫 RAISERROR 陳述式您必須使用重要性層級 10 的錯誤訊息。重要性層級 10 的代表資訊的訊息,指出因為使用者輸入不正確的資訊時發生問題。
  • 如果想 RAISERROR 陳述式被呼叫時中止批次您必須使用嚴重性層級大於 20 的錯誤] 訊息,而且您必須包含的記錄選項使用 RAISERROR 陳述式。當您執行這項操作時,原本要之後中止 RAISERROR 陳述式呼叫,會執行所有 Transact-SQL 陳述式和所有開啟的交易都會自動復原運作。

    如需有關嚴重性層級的詳細資訊,請參閱 SQL Server 線上叢書 》 中的 < 錯誤訊息嚴重性層級 > 主題]。

方法 2

使用在作業步驟的指令碼檔案
如果您想整個指令碼執行不論 RAISERROR 陳述式的呼叫頻率,而且重要性層級小於 20,您可以使用在作業步驟的指令碼檔案。如果要執行這項操作,請依照下列步驟執行:
  1. 儲存指令碼檔案中。
  2. CmdExec 作業步驟以建立 SQL Server 代理程式工作,然後執行步驟中的 [指令碼檔案。

    以下是範例:
    osql -E -i c:\script.sql
當您使用 [指令碼檔案如果藉由使用 osql 公用程式所收到利用 SQL 查詢分析器執行批次執行批次時您會收到相同的結果。

呼叫 20 或使用 WITH 記錄選項更高的嚴重性層級的 RAISERROR 陳述式會導致以關閉,連線及原本要 RAISERROR 呼叫會被略過] 之後執行的所有陳述式。

狀況說明

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。 這個問題,首先已經在 Microsoft SQL Server 2000 服務套件 4 中獲得修正。

其他相關資訊

如果在 SQL Server 代理程式作業步驟的 RAISERROR 陳述式的錯誤訊息的嚴重性層級 2 到 9 工作,工作步驟失敗的結果的結尾。不過,輸出不被抑制執行批次中的 RAISERROR 陳述式之後的陳述式。

如果錯誤的嚴重性層級訊息中 「 RAISERROR 陳述式 10、 1 或 0 作業,作業步驟成功執行。 因此,本文的 < 徵狀 > 一節所述的問題不會發生。

雖然 SQL Server 代理程式作業失敗時如果使用 SQL 查詢分析、 「 isql 公用程式 」 或 osql 公用程式執行相同的 SQL 指令碼,您將會收到您所預期的結果。

重現這個問題的步驟

  1. 建立具有 Transact-SQL 指令碼 (TSQL) 作業步驟的 [新的 SQL Server 代理程式工作]。
  2. Type or paste the following Transact-SQL statement in the Command box.
       select convert(varchar(50), @@version) as ' SQL Server Version Number'
       raiserror('Test raiserror with severity 10', 10, 1)
       select id, convert(varchar(12), name) as 'Table Name' 
        from sysobjects where id < 4
  3. 在 [進階] 索引標籤的 Transact-SQL 指令碼 (TSQL) 命令選項] 區段下方鍵入 [輸出檔案] 方塊中的 [C:\Raiserror.log]。
  4. 按一下以選取 [新增] 選項。
  5. 按一下 [套用],然後再按一下 [確定]
  6. 按一下 [套用],然後再按一下 [確定]
  7. 在 [SQL Server 企業管理員,已建立的 SQL Server 代理程式工作上按一下滑鼠右鍵,然後再按 [開始工作
  8. 啟動 SQL Profiler 追蹤。
  9. For the same SQL Server Agent job step, change the severity level to 11 by replacing the command in the job step as follows.
       select convert(varchar(50), @@version) as ' SQL Server Version Number'
       raiserror('Test raiserror with severity 11', 11, 1)
       select id, convert(varchar(12), name) as 'Table Name' 
        from sysobjects where id < 4
  10. 再次執行工作。
以下為 Raiserror.log 檔案中產生的結果
Job 'raiserror' : Step 1, 'test raiserror' : Began Executing 2002-07-23 15:48:59

SQL Server Version Number                         
--------------------------------------------------
Microsoft SQL Server  2000 - 8.00.534 (Intel x86) 

(1 rows(s) affected)

Test raiserror with severity 10 [SQLSTATE 01000]
id          Table Name  
----------- ------------
1           sysobjects
2           sysindexes
3           syscolumns

(3 rows(s) affected)

Job 'raiserror' : Step 1, 'test raiserror' : Began Executing 2002-07-23 15:49:17

SQL Server Version Number                         
--------------------------------------------------
Microsoft SQL Server  2000 - 8.00.534 (Intel x86) 

(1 rows(s) affected)

Msg 50000, Sev 11: Test raiserror with severity 11 [SQLSTATE 42000]

此 Raiserror.log] 檔案中您可以看到嚴重性層級為 10,從工作的所有輸出已都列印輸出] 檔中並作業已成功的結果。

在這個 Raiserror.log] 檔案中您可以看到嚴重性層級為 11 前, 兩個陳述式從輸出已列印到輸出的檔案並作業已失敗的結果。 而且,RAISERROR 訊息處於錯誤訊息格式而非嚴重性層級 10 的資訊的格式。追蹤檔案會顯示所有陳述式已順利執行。

如果從 2 到 9 變更重要性層級為一個數字中,不抑制輸出,而且作業結果將會失敗,為該步驟及工作。訊息格式會作為 11 或更高的嚴重性層級的錯誤訊息格式相同。

屬性

文章編號: 309802 - 上次校閱: 2007年11月2日 - 版次: 5.5
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
關鍵字:?
kbmt kbhotfixserver kbqfe kbqfe kbsqlserv2000presp4fix kbfix kbbug kbpending KB309802 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:309802
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com