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
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;
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
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