Frage

Ich versuche, um ein Problem zu isolieren (, die das Thema in stackoverflow.com/q/483787/537284 ähnelt). Die Ausgabe beinhaltet eine gespeicherte Prozedur und tritt „zufällig“ einmal pro Woche. Um zu versuchen, das Problem zu reproduzieren, habe ich verschiedene Verfahren Versionen zu imitieren gute und schlechte mögliche Ergebnisse:

  • Gute mehrreihigen Einzel resultset.
  • Gutes mehrreihigen Einzel resultset mit Informationsnachricht.
  • Gutes mehrreihigen Einzel resultset mit Raiserror (weniger als Level 11).
  • Gutes mehrreihigen Einzel resultset mit Print.
  • Gutes leer einziges Suchresultates.
  • Bad Syntaxfehler.
  • Bad Syntaxfehler mit try / catch.
  • Bad Fehler mit Raiserror (Ebene 11).
  • Bad Fehler mit Raiserror (Level 11) und try / catch.

Zwischen diesen Tests die Syntaxfehler mit try / catch Version verhielt sich anders als das, was ich erwarten würde. Zwei Resultset (ein leer und der andere von dem Belegungsbefehl) kommen.

Sind die Syntaxfehler teilweise ausgeführt werden? Ich erwartete das Ergebnis der catch-Block und nicht der Versuch. Ich vergleichen diese mit einem Raiserror und mit der Schwere 11, es löst den Block fängt mit nur einem resultset zurückgegeben. Was ist der Unterschied zwischen den Syntaxfehlern und dem Raiserror

Hier ist mein Testverfahren:

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

Hier ist mein Test-Tabelle (von anderen riss):

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;
War es hilfreich?

Lösung

Achten Sie auf die Bemerkungen Abschnitt vollständig auf TRY ... CATCH in Bücher zu lesen Online . Es erklärt dieses Verhalten bis ins kleinste Detail.

Was ich nicht verstehe, ist diese ganze Sache über „zwingt einen Syntaxfehler“ ... Wenn es in einer gespeicherten Prozedur ist, und Sie haben einen Syntaxfehler in ihm, wird die SP nicht einmal erstellt werden. Könnte es sein, dass Sie eine ältere Version der gespeicherten Prozedur tatsächlich ausgeführt wird?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top