Stored Procedure Errore di sintassi alla ricompilazione tempo è intrappolato dalla cattura e restituisce vuoto Resultset
-
25-09-2019 - |
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;
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?