web-dev-qa-db-fra.com

Exception de lancement T-SQL

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?

30
user3021830

Essayez avec ceci:

RAISERROR('your message here',16,1)
10
SubqueryCrunch

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;
38
Roger Layton

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.

18
Alex N.

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»

7
djhill8262

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.

3
oreocokes

mettez ; before THROW mot-clé et cela fonctionnera.

3
user1945580

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
0
Eduardo Cuomo