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?

30
demandé sur marc_s 2014-10-15 11:41:38

7 réponses

Essayez avec ceci:

RAISERROR('your message here',16,1)
8
répondu SubqueryCrunch 2014-10-15 08:58:38

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;
36
répondu Roger Layton 2015-03-11 15:58:53

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.

16
répondu Alex N. 2016-04-11 20:10:57

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 "

7
répondu djhill8262 2015-11-30 14:59:59

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.

3
répondu oreocokes 2017-02-08 18:56:22

mettre ; avant THROW mot-clé et il fonctionnera.

2
répondu user1945580 2016-02-23 08:56:48

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
répondu Eduardo Cuomo 2014-12-16 14:44:19