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'」エラーの近くに誤ったステートメントが表示され、見えない解決策を見つけます。
助言がありますか?
これで試してください:
RAISERROR('your message here',16,1)
これは、SQL Server 2014でも引き続き発生します。
BEGINの最後にセミコロンを挿入すると役立つことがわかりました。
このアプローチにはエラーがあります
IF 'A'='A'
BEGIN
THROW 51000, 'ERROR', 1;
END;
そして、このアプローチにはエラーがありません
IF 'A'='A'
BEGIN;
THROW 51000, 'ERROR', 1;
END;
問題を解決するには、
「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の新機能です。
このエラーは、これを誤ってコーディングした場合にも発生する可能性があります。
RAISEERROR('your message here',16,1)
「レイズエラー」のつづりを間違えると気づく前に、私は4時間じっと見つめ、セミコロンをあちこちに置いた。
多くの回答で指摘されているように、THROWステートメントはSQL Server 2012で導入されました。したがって、このバージョンのSQL Server以降を使用している場合は、THROWを使用するか、RAISERRORを使用することをお勧めします。
また、THROWステートメントの前のステートメントの後には、セミコロン(;)ステートメントターミネータが続く必要があります。そのため、スローの前にセミコロンを含める必要があります。
SQL ServerでのRAISERRORとTHROWの違い に関するこの記事をご覧ください。
また、MSDNのドキュメントを読むことをお勧めします THROW(Transact-SQL) このセクションでは、これらの問題について「解説」セクションで説明しています。
put ;
の前にTHROW
キーワードがあり、機能します。
私が使う:
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