Stored Procedure Errore di sintassi alla ricompilazione tempo è intrappolato dalla cattura e restituisce vuoto Resultset

StackOverflow https://stackoverflow.com/questions/4404873

Domanda

Sto cercando di isolare un problema (che assomiglia il tema in stackoverflow.com/q/483787/537284). Il tema coinvolge una stored procedure e si verifica "a caso" una volta alla settimana. Per cercare di riprodurre il problema, ho creato diverse versioni procedura per buona mimica e possibili esiti negativi:

  • buon multi-fila singola di risultati.
  • Buon gruppo di risultati unico multi-fila con messaggio informativo.
  • Buona di risultati unico multi-riga con Raiserror (inferiore al livello 11).
  • Buon gruppo di risultati unico multi-fila con stampa.
  • Buon risultato vuoto singola.
  • Errore di Bad sintassi.
  • Errore di sintassi Bad con try / catch.
  • Bad errore Raiserror (livello 11).
  • errore Bad con Raiserror (livello 11) e try / catch.

Tra questi test, l'errore di sintassi con la versione try / catch è comportato in modo diverso rispetto a quello che ci si aspetterebbe. Due gruppi di risultati (uno vuoto e l'altro dal istruzioni cattura) tornano.

L'errore di sintassi ottenere parzialmente eseguito? Mi aspettavo il risultato del blocco catch e non il tentativo. Ho confrontato questo con un Raiserror e con la severità 11, si attiva il blocco catch con un solo gruppo di risultati restituiti. Qual è la differenza tra l'errore di sintassi e il Raiserror

Ecco la mia procedura di prova:

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

Qui è la mia tabella di test (strappato da altri):

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;
È stato utile?

Soluzione

Assicurarsi di leggere completamente la sezione Osservazioni sul TRY ... CATCH in Libri online. Essa spiega questo comportamento in dettaglio doloroso.

Quello che non capisco è tutta questa faccenda "forzare un errore di sintassi" ... se è in una stored procedure e si dispone di un errore di sintassi in esso, non sarà nemmeno essere creata la SP. Potrebbe essere che si sta effettivamente eseguendo una versione precedente della stored procedure?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top