Je suis confronté à la fameuse «syntaxe incorrecte» lors de l'utilisation d'une instruction THROW
dans une procédure stockée T-SQL. Je l'ai googlé et vérifié les questions sur StackOverflow mais les solutions proposées (et étrangement, acceptées) ne fonctionnent pas pour moi.
Je modifie une procédure stockée comme suit:
ALTER PROCEDURE [dbo].[CONVERT_Q_TO_O]
@Q_ID int = NULL,
@IDENTITY INT = NULL OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @EXISTING_RECORD_COUNT [int];
SELECT
@EXISTING_RECORD_COUNT = COUNT (*)
FROM
[dbo].[O]
WHERE
[Q_ID] = @Q_ID
IF @EXISTING_RECORD_COUNT = 0
BEGIN
-- DO SOME STUFF HERE
-- RETURN NEW ID
SELECT @IDENTITY = SCOPE_IDENTITY()
END
ELSE
BEGIN
THROW 99001, 'O associated with the given Q Id already exists', 1;
END
END
GO
Quand je code ce T-SQL je reçois une erreur en disant
Déclaration incorrecte près de 'THROW'. En attente de CONVERSATION, DIALOG, DISTRIBUTED ou TRANSACTION
Toutes les solutions suggèrent de mettre un point-virgule soit avant "THROW", soit après les instructions "ELSE BEGIN". Lorsque je modifie le T-SQL, j'obtiens simplement l'erreur "Instruction incorrecte près de 'THROW'" et n'arrive pas à trouver de solution.
Aucune suggestion?
Essayez avec ceci:
RAISERROR('your message here',16,1)
Cela continue à se produire dans SQL Server 2014.
J'ai constaté que mettre le point-virgule à la fin de BEGIN aide.
Cette approche a l'erreur
IF 'A'='A'
BEGIN
THROW 51000, 'ERROR', 1;
END;
Et cette approche n'a pas l'erreur
IF 'A'='A'
BEGIN;
THROW 51000, 'ERROR', 1;
END;
Pour résoudre votre problème,
Déclaration incorrecte près de 'THROW'. En attendant CONVERSATION, DIALOG, DISTRIBUTED, ou TRANSACTION
mettez le point-virgule avant votre déclaration de projection:
BEGIN
;THROW 99001, 'O associated with the given Q Id already exists', 1;
END
Et à propos de
"Déclaration incorrecte près de 'THROW'".
Essayez de l'utiliser si vous utilisez une version plus ancienne que SQL 2012:
RAISERROR('O associated with the given Q Id already exists',16,1);
Parce que THROW est une nouvelle fonctionnalité de SQL 2012.
Cette erreur peut également se produire si vous codez de manière incorrecte ceci:
RAISEERROR('your message here',16,1)
J'ai regardé ça pendant quatre heures, en mettant des points-virgules un peu partout, avant de réaliser que j'avais mal orthographié «RAISERROR»
Comme indiqué dans de nombreuses réponses, l'instruction THROW a été introduite dans SQL Server 2012. Par conséquent, si vous utilisez cette version de SQL Server ou une version ultérieure, il est recommandé d'utiliser THROW, sinon utilisez RAISERROR.
De plus, l'instruction précédant l'instruction THROW doit être suivie du point-virgule (;). C'est pourquoi vous devez inclure un point-virgule avant le lancer.
Regardez cet article sur les Différences entre RAISERROR et THROW dans Sql Server
Je voudrais également vous encourager à lire la documentation de MSDN THROW (Transact-SQL) qui explique ces questions à la section Remarques.
mettez ;
before THROW
mot-clé et cela fonctionnera.
J'utilise:
CREATE PROCEDURE dbo.THROW_EXCEPTION @Message VARCHAR(MAX), @Code VARCHAR(MAX) = -1 AS BEGIN
DECLARE @BR VARCHAR(MAX) = CHAR(13) + CHAR(10)
DECLARE @TAB VARCHAR(MAX) = ' '
DECLARE @T TABLE (X BIT)
INSERT INTO @T (X) VALUES (
@BR + @TAB + 'Error! ' + ISNULL(@Message, '{NULL}')
+ @BR + @TAB + 'Code: ' + ISNULL(@Code, '{NULL}')
+ @BR)
END
Suivant:
EXEC THROW_EXCEPTION 'Your Message'
-- OR
EXEC THROW_EXCEPTION 'Your Message', 'Error Code'
-- OR
EXEC THROW_EXCEPTION 'Your Message', 123456