web-dev-qa-db-ja.com

T-SQLスロー例外

T-SQLストアドプロシージャでTHROWステートメントを使用しているときに、有名な「不正な構文」に直面しています。私はそれをグーグルで調べ、StackOverflowの質問を確認しましたが、提案された(そして奇妙なことに、受け入れられた)解決策は私にはうまくいきません。

次のようにストアドプロシージャを変更しています。

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

このT-SQLをコーディングすると、次のエラーが表示されます。

「THROW」の近くの誤ったステートメント。会話、ダイアログ、配布、またはトランザクションを期待する

すべてのソリューションでは、「THROW」ステートメントの前または「ELSE BEGIN」ステートメントの後にセミコロンを配置することをお勧めします。 T-SQLを変更すると、「 'THROW'」エラーの近くに誤ったステートメントが表示され、見えない解決策を見つけます。

助言がありますか?

39
user3021830

これで試してください:

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

これは、SQL Server 2014でも引き続き発生します。

BEGINの最後にセミコロンを挿入すると役立つことがわかりました。

このアプローチにはエラーがあります

IF 'A'='A'
BEGIN
   THROW 51000, 'ERROR', 1;
END;

そして、このアプローチにはエラーがありません

IF 'A'='A'
BEGIN;
  THROW 51000, 'ERROR', 1;
END;
46
Roger Layton

問題を解決するには、

「THROW」の近くの誤ったステートメント。会話、ダイアログ、配布、またはトランザクションを期待する

throwステートメントの前にセミコロンを置きます。

BEGIN
    ;THROW 99001, 'O associated with the given Q Id already exists', 1;
END

そして約

「 'THROW'の近くの誤ったステートメント」。

SQL 2012よりも古いバージョンを使用している場合は、これを使用してください。

RAISERROR('O associated with the given Q Id already exists',16,1);

THROWはSQL 2012の新機能です。

21
Alexandre N.

このエラーは、これを誤ってコーディングした場合にも発生する可能性があります。

RAISEERROR('your message here',16,1)

「レイズエラー」のつづりを間違えると気づく前に、私は4時間じっと見つめ、セミコロンをあちこちに置いた。

7
djhill8262

多くの回答で指摘されているように、THROWステートメントはSQL Server 2012で導入されました。したがって、このバージョンのSQL Server以降を使用している場合は、THROWを使用するか、RAISERRORを使用することをお勧めします。

また、THROWステートメントの前のステートメントの後には、セミコロン(;)ステートメントターミネータが続く必要があります。そのため、スローの前にセミコロンを含める必要があります。

SQL ServerでのRAISERRORとTHROWの違い に関するこの記事をご覧ください。

また、MSDNのドキュメントを読むことをお勧めします THROW(Transact-SQL) このセクションでは、これらの問題について「解説」セクションで説明しています。

3
Pablo Corso

put ;の前にTHROWキーワードがあり、機能します。

3
user1945580

私が使う:

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

次:

EXEC THROW_EXCEPTION 'Your Message'
-- OR
EXEC THROW_EXCEPTION 'Your Message', 'Error Code'
-- OR
EXEC THROW_EXCEPTION 'Your Message', 123456
0
Eduardo Cuomo