我正在尝试隔离一个问题(类似于 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;