FIX: TRANSACT-SQL 批处理中的 RAISERROR 语句的调用可能会导致出现故障并丢失 SQL Server 中的输出一个 SQLAgent 作业

文章翻译 文章翻译
文章编号: 309802 - 查看本文应用于的产品
重要本文包含有关如何修改注册表的信息。请确保您对其进行修改之前备份注册表。请确保您知道如何还原注册表发生问题。有关如何备份、 还原,以及修改注册表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
256986在 Microsoft Windows 注册表的说明
展开全部 | 关闭全部

本文内容

症状

和 SQLAgent 作业步骤类型是 TRANSACT-SQL 脚本时在 命令 字段中的新建作业步骤-< SQL Server 实例名称 > 这些语句 对话框框调用 TRANSACT-SQL RAISERROR 语句严重性等级 11 或更高 WITH LOG 选项的情况下该作业将结束与失败的结果。但是,虽然所有 TRANSACT-SQL 语句运行 RAISERROR 语句之后调用运行,被抑制所有输出。 因此,会生成任何输出的语句后该 RAISERROR 语句运行。实际上,这可能会导致混乱,语句在作业中发生了什么变化。如果您想要查看什么实际上已运行,必须查看 SQL 事件探查器跟踪。有关 SQL 事件探查器跟踪的详细信息,请参阅"SQL 事件探查器"主题 SQL Server 联机丛书中。

解决方案

警告如果您修改注册表错误地使用注册表编辑器或使用另一种方法,则可能会出现严重问题。这些问题可能需要重新安装操作系统。Microsoft 不能保证可以解决这些问题。修改注册表的风险由您自己承担。

服务包信息

若要解决此问题,获得最新的 service pack,对于 Microsoft SQL Server 2000。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
290211如何获取最新的 SQL Server 2000 服务包

修补程序信息

此修补程序的英文版具有的文件属性 (或更新的文件属性) 在下表中列出。日期和时间对这些文件列出在协调世界时 (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
注意由于存在文件依赖性最新的修补程序或功能,它包含这些文件可能还包含其他文件。

应用此修补程序后,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 语句 WITH LOG 选项。这样做后是应该中止 RAISERROR 语句调用后, 运行的所有 TRANSACT-SQL 语句和所有打开的事务都将自动回滚。

    有关严重级别的详细信息,请参阅 SQL Server 联机丛书中的错误消息严重性级别主题。

方法 2

使用在作业步骤的脚本文件
如果您希望执行的频率 RAISERROR 语句称为,而不考虑整个脚本,并严重级别为小于 20 可以使用作业步骤中的脚本文件。这样做,请按照下列步骤操作:
  1. 将脚本保存到文件中。
  2. 创建与一个的 CmdExec 作业步骤的 SQL Server 代理作业,然后运行步骤中的脚本文件。

    下面是一个示例:
    osql -E -i c:\script.sql
您在使用脚本文件时您将收到相同的结果,如果通过使用 osql 实用工具,如果使用 SQL 查询分析器运行该批处理,则会收到运行批处理。

调用 RAISERROR 语句使用严重级别为 20 或更高版本使用 WITH LOG 选项将导致连接关闭,和 $ 已应跳过 RAISERROR 调用后,要运行的所有语句。

状态

Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。 Microsoft SQL Server 2000 Service Pack 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 事件探查器跟踪。
  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 标准版
  • 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
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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