programing

T-SQL 스로우 예외

newstyles 2023. 7. 13. 20:42

T-SQL 스로우 예외

사용하는 동안 유명한 '잘못된 구문'에 직면했습니다.THROWT-SQL 저장 프로시저의 문입니다.저는 그것을 구글에 검색하고 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' 근처의 문이 잘못되었습니다.대화, 대화, 분산 또는 트랜잭션이 필요합니다.

모든 솔루션은 '쓰임' 문 앞이나 'ELSE BEGIN' 문 뒤에 세미콜론을 배치할 것을 제안합니다.T-SQL을 수정하면 "TROW 근처의 잘못된 문장" 오류가 발생하고 해결책을 찾을 수 없는 것 같습니다.

좋은 의견이라도 있나?

이 문제는 SQL Server 2014에서 계속 발생합니다.

BEGIN 끝에 세미콜론을 넣는 것이 도움이 된다는 것을 알게 되었습니다.

이 접근 방식에는 오류가 있습니다.

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

그리고 이 접근법은 오류가 없습니다.

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

당신의 문제를 해결하기 위해,

'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);

SLOW는 SQL 2012의 새로운 기능이기 때문입니다.

SQL Server 2012 이상의 경우:

;THROW 60000, 'your message here', 1

메시지에 변수를 전달하려면 다음을 사용합니다.

DECLARE
    @Errors INT = 2,
    @ErrMsg NVARCHAR(500)

SET @ErrMsg = 'You have '+CAST(@Errors AS NVARCHAR) + ' errors!'
;THROW 60000, @ErrMsg, 1

RAISEROR와 달리 SLOW는 추가 코드 실행을 차단합니다.

SLOW 문서

레거시 옵션:

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

메시지에 변수를 전달하려면 다음을 사용합니다.

DECLARE
    @Errors INT = 2,
    @ErrMsg NVARCHAR(500)

SET @ErrMsg = 'You have '+CAST(@Errors AS NVARCHAR) + ' errors!'
RAISERROR(@ErrMsg, 16, 1)

SQL Server 버전 확인하기SELECT @@VERSION

놓다;전에THROW키워드를 지정하면 작동합니다.

이 오류는 코드를 잘못 지정한 경우에도 발생할 수 있습니다.

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

저는 "RAISERROR"의 철자가 틀렸다는 것을 깨닫기 전에 사방에 세미콜론을 두면서 4시간 동안 그것을 응시했습니다.

많은 답변을 통해 지적되었듯이, SLOW 문은 SQL Server 2012에 도입되었습니다.따라서 이 버전의 SQL Server 이상을 사용하는 경우에는 SLOW를 사용하고 그렇지 않은 경우에는 RAISERROR를 사용하는 것이 좋습니다.

또한 SLOW 문 앞의 문에는 세미콜론(;) 문 종료자가 와야 합니다.그렇기 때문에 던지기 전에 세미콜론을 포함해야 합니다.

SQL Server의 RAISERROR와 SLOW의 차이점에 대한 이 기사를 보십시오.

또한 비고 섹션에서 이러한 문제를 설명하는 MSDN SLOW(Transact-SQL)의 문서를 읽어보시기 바랍니다.

이 질문을 올려주셔서 감사합니다.IDE가 구문 오류를 표시하는 동안 컴파일되고 정상적으로 실행됩니다(참고: SQL Server 2106을 사용하고 있습니다).

또한 하나의 진술서만 필요하다면, 그냥 사용할 수 있다는 것을 발견했습니다.

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

구문 오류 메시지는 표시되지 않습니다.

언급URL : https://stackoverflow.com/questions/26377065/t-sql-throw-exception