T-SQL 스로우 예외
사용하는 동안 유명한 '잘못된 구문'에 직면했습니다.THROW
T-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는 추가 코드 실행을 차단합니다.
레거시 옵션:
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
'programing' 카테고리의 다른 글
커밋을 준비 영역으로 이동하려면 어떻게 해야 합니까? (0) | 2023.07.13 |
---|---|
TSC(TypeScript Compiler)를 사용하여 Node.js ES6(ESM) 모듈을 해결하는 방법.TSC가 올바른 파일-ext를 내보내지 않습니다. (0) | 2023.07.13 |
SQL Server에 저장된 프로시저의 마지막 실행 날짜 (0) | 2023.07.08 |
이 장고 앱 튜토리얼에서 choice_set는 무엇입니까? (0) | 2023.07.08 |
ASP.NET 5 클래스 라이브러리 프로젝트를 만드는 이유는 무엇입니까? (0) | 2023.07.08 |