0

我正在尝试隔离一个问题(类似于 stackoverflow.com/q/483787/537284 中的主题)。该问题涉及存储过程,并且每周“随机”发生一次。为了尝试重现该问题,我创建了不同的程序版本来模拟好的和坏的可能结果:

  • 良好的多行单结果集。
  • 带有信息性消息的良好多行单结果集。
  • 具有 Raiserror 的良好多行单结果集(低于 11 级)。
  • 良好的多行单结果集与打印。
  • 良好的空单结果集。
  • 语法错误。
  • try/catch 语法错误。
  • Raiserror 错误(级别 11)。
  • Raiserror(级别 11)和 try/catch 出现错误。

在这些测试之间,try/catch 版本的语法错误与我预期的不同。两个结果集(一个为空,另一个来自 catch 指令)返回。

语法错误是否被部分执行?我期待的是 catch 块的结果,而不是 try 的结果。我将此与Raiserror进行了比较,并使用严重性 11,它触发了仅返回一个结果集的 catch 块。语法错误和Raiserror 有什么区别?

这是我的测试程序:

AS
BEGIN
    SET NOCOUNT ON
    SET ANSI_WARNINGS ON    
    SET IMPLICIT_TRANSACTIONS OFF 
    SET XACT_ABORT OFF 
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

BEGIN TRY
    --RAISERROR ('goes to message tab yes?', 11, 1) WITH NOWAIT
    SELECT '1' [myfield] FROM test_fulltext (nolock) WHERE CONTAINS(Command,'a monkey')
    RETURN 0
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER() [ErrorNumber]
END CATCH
RETURN -9999
END

这是我的测试表(从其他人那里撕下来的):

CREATE TABLE test_fulltext 
( 
    SPID INT NOT NULL, 
    Status VARCHAR(32) NULL, 
    Login SYSNAME NULL, 
    HostName SYSNAME NULL, 
    BlkBy SYSNAME NULL, 
    DBName SYSNAME NULL, 
    Command VARCHAR(32) NULL, 
    CPUTime INT NULL, 
    DiskIO INT NULL, 
    LastBatch VARCHAR(14) NULL, 
    ProgramName VARCHAR(32) NULL, 
    SPID2 INT 
)
CREATE UNIQUE INDEX fulltextui ON test_fulltext(SPID);
CREATE FULLTEXT CATALOG fulltextft AS DEFAULT;
CREATE FULLTEXT INDEX ON test_fulltext(Command) KEY INDEX fulltextui;
4

1 回答 1

0

请务必完整阅读Books Online 中关于 TRY...CATCH的备注部分。它以痛苦的细节解释了这种行为。

我不明白的是关于“强制语法错误”的整个业务......如果它在一个存储过程中并且你有一个语法错误,那么甚至不会创建 SP。可能是您实际上正在执行旧版本的存储过程吗?

于 2010-12-10T01:46:24.337 回答