Синтаксическая ошибка хранимой процедуры во время перекомпиляции ловится Catch и возвращает пустой набор результатов - PullRequest
0 голосов
/ 10 декабря 2010

Я пытаюсь изолировать проблему (которая напоминает тему в stackoverflow.com/q/483787/537284).Проблема связана с хранимой процедурой и возникает «случайным образом» один раз в неделю.Чтобы попытаться воспроизвести проблему, я создал различные версии процедур для имитации возможных хороших и плохих результатов:

  • Хороший многострочный однобитный набор результатов.
  • Хороший многострочный однократный результат с информационнымmessage.
  • Хороший однорядный набор результатов с Raiserror (меньше уровня 11).
  • Хороший однорядный набор результатов с Print.
  • Хороший пустой набор результатов.
  • Неверная синтаксическая ошибка.
  • Неверная синтаксическая ошибка с try / catch.
  • Неверная ошибка с Raiserror (уровень 11).
  • Неверная ошибка с Raiserror (уровень11) и try / catch.

Между этими тестами синтаксическая ошибка с версией try / catch вела себя не так, как я ожидал.Возвращаются два набора результатов (один пустой, а другой из инструкции catch).

Частично ли выполняется синтаксическая ошибка?Я ожидал результата блока catch, а не попытки.Я сравнил это с 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;

1 Ответ

0 голосов
/ 10 декабря 2010

Обязательно полностью прочитайте раздел «Примечания» на TRY ... CATCH в электронной документации .Это объясняет это поведение до мельчайших подробностей.

Что я не понимаю, так это весь бизнес о «принудительном использовании синтаксической ошибки» ... Если она находится в хранимой процедуре и в ней есть синтаксическая ошибка,SP даже не будет создан.Может быть, вы на самом деле выполняете старую версию хранимой процедуры?

...