T-SQL Throw Exception
je suis confronté à la fameuse" syntaxe incorrecte "en utilisant une instruction THROW
dans une procédure stockée T-SQL. J'ai Googlé et vérifié les questions sur StackOverflow mais les solutions proposées (et étrangement, accepté) 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 disant
déclaration incorrecte près de "lancer". Attente CONVERSATION, dialogue, distribué, ou TRANSACTION
toutes les solutions suggérées pour mettre un point-virgule soit avant 'jeter' ou après 'autrement commencer' déclarations. Lorsque je modifie le T-SQL, j'obtiens tout simplement l'erreur" "déclaration incorrecte près de" lancer " " et ne semble pas pouvoir trouver une solution.
des suggestions?
7 réponses
cela continue à se produire dans SQL Server 2014.
j'ai trouvé 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 "lancer". Attendre la CONVERSATION, dialoguer, Distribué, ou TRANSACTION
mettez le point-virgule avant votre énoncé de lancer:
BEGIN
;THROW 99001, 'O associated with the given Q Id already exists', 1;
END
et sur le
"instruction Incorrecte près de 'JETER'".
essayez d'utiliser ceci au cas où vous utilisez une version plus ancienne que SQL 2012:
RAISERROR('O associated with the given Q Id already exists',16,1);
parce que lancer est une nouvelle fonctionnalité de SQL 2012.
cette erreur peut également se produire si vous coder incorrectement ce:
RAISEERROR('your message here',16,1)
j'ai regardé ça pendant quatre heures, en mettant des points-virgule partout, avant de réaliser que j'avais mal orthographié "RAISERROR "
comme l'ont souligné de nombreuses réponses, la déclaration THROW a été introduite dans SQL Server 2012. Donc, si vous utilisez cette version de SQL Server ou une version plus récente, il est recommandé D'utiliser THROW, sinon utilisez RAISERROR.
de plus, l'énoncé précédant l'énoncé de lancer doit être suivi du terminateur du point-virgule (;). C'est pourquoi vous devez inclure un point-virgule avant le lancer.
regardez cet article sur les différences entre RAISERROR and THROW in Sql Server
j'aimerais aussi vous encourager à lire la documentation de MSDN THROW (Transact-SQL) qui explique ces questions à la section des remarques.
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