0

Ich versuche, ein Problem zu isolieren (das dem Thema in stackoverflow.com/q/483787/537284 ähnelt). Das Problem betrifft eine gespeicherte Prozedur und tritt "zufällig" einmal pro Woche auf. Um das Problem zu reproduzieren, habe ich verschiedene Verfahrensversionen erstellt, um gute und schlechte Ergebnisse zu imitieren:Stored Procedure Syntaxfehler bei Neukompilierung Zeit wird von Catch gefangen und gibt leere Ergebnismenge zurück

  • Gute mehrreihige Ergebnismenge.
  • Gutes mehrzeiliges einzelnes Resultset mit Informationsnachricht.
  • Gutes mehrzeiliges Ergebnisergebnis mit Raiserror (weniger als Level 11).
  • Gutes mehrzeiliges Einzelergebnis mit Druck.
  • Gut leer einzigen Ergebnissatz.
  • Schlechter Syntaxfehler.
  • Schlechter Syntaxfehler mit try/catch.
  • Schlechter Fehler bei Raiserror (Stufe 11).
  • Schlechter Fehler mit Raiserror (Stufe 11) und versuchen/fangen.
  • Zwischen diesen Tests verhielt sich der Syntaxfehler mit der try/catch-Version anders als erwartet. Zwei Resultsets (eins leer und das andere von der Fanganweisung) kommen zurück.

    Wird der Syntaxfehler teilweise ausgeführt? Ich habe das Ergebnis des Catch-Blocks erwartet und nicht den Versuch. Ich verglich dies mit einem Raiserror und mit Schweregrad 11 löst es den catch-Block mit nur einem Ergebnissatz zurückgegeben. Was ist der Unterschied zwischen dem Syntaxfehler 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; 
    

    Antwort

    0

    Achten Sie auf die Bemerkungen Abschnitt vollständig auf TRY...CATCH in Books Online zu lesen. Es erklärt dieses Verhalten in schmerzhaften Details.

    Was ich nicht verstehe, ist dieses ganze Geschäft über "Erzwingen eines Syntaxfehlers" ... Wenn es in einer gespeicherten Prozedur ist und Sie einen Syntaxfehler darin haben, wird der SP nicht einmal erstellt. Könnte es sein, dass Sie tatsächlich eine ältere Version der gespeicherten Prozedur ausführen?

    +0

    Danke für den Artikel. Es ist sehr hilfreich. Es beantwortet die Frage nach dem Unterschied zwischen Raiserror und Syntaxfehler. Ich glaube, dass die gespeicherte Prozedur kompiliert und erstellt wird, da der Syntaxfehler innerhalb der Musterübereinstimmungszeichenfolge liegt, die zur Erstellungszeit durchkommen muss. Ich werde versuchen, dort mit meiner Frage zu posten. Es gibt eine Erklärung zur Neukompilierung und Verschiebung der Namensauflösung, die am nächsten zu sein scheint, aber es wird weiterhin angegeben, dass der Fehler nicht vom Catch abgefangen wird und zur ursprünglichen Ausführungsebene zurückkehrt. Was ich bezeuge, ist der Fang, der nach der Syntax err ausgeführt wird. – patterns

    +0

    Dieses Verhalten scheint speziell für meine Umgebung (2008 SP1) zu sein, die in SP2 nicht vorhanden ist. Der Online-Artikel, auf den von @DaveMarkle verwiesen wird, erläutert das richtige Verhalten. Der msdn-Thread als Referenz [link] (http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/db7d18db-4cac-49c1-befd-c668c0c6b0a0/) – patterns

    Verwandte Themen