다음을 통해 공유


@@ERROR(Transact-SQL)

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

최근에 실행된 Transact-SQL 문의 오류 번호를 반환합니다.

Transact-SQL 구문 표기 규칙

구문

@@ERROR  

반환 형식

integer

설명

이전 Transact-SQL 문에 오류가 발생하지 않으면 0이 반환됩니다.

이전 문에 오류가 발생하면 오류 번호가 반환됩니다. 오류가 sys.messages 카탈로그 뷰의 오류 중 하나이면 @@ERROR에 해당 오류에 대한 sys.messages.message_id 열의 값이 포함됩니다. sys.messages에 있는 @@ERROR 오류 번호와 연결된 텍스트를 볼 수 있습니다.

@@ERROR는 지워지고 실행된 각 문에서 다시 설정되므로 확인된 문 바로 다음에 확인하거나 나중에 확인할 수 있는 지역 변수에 저장합니다.

TRY...CATCH 구문을 사용하여 오류를 처리하세요. 또한 TRY...CATCH는 @@ERROR보다 많은 오류 정보를 반환하는 추가 시스템 함수(ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY 및 ERROR_STATE)를 지원합니다. TRY...CATCH는 오류가 발생된 문 바로 다음 문의 오류 번호만 반환하도록 제한되지 않은 ERROR_NUMBER 함수도 지원합니다. 자세한 내용은 TRY...CATCH(Transact-SQL)를 참조하세요.

예제

A. @@ERROR를 사용하여 특정 오류 검색

다음 예에서는 @@ERROR를 사용하여 UPDATE 문에서 CHECK 제약 조건 위반(오류 #547)을 확인합니다.

USE AdventureWorks2022;  
GO  
UPDATE HumanResources.EmployeePayHistory  
    SET PayFrequency = 4  
    WHERE BusinessEntityID = 1;  
IF @@ERROR = 547
    BEGIN
    PRINT N'A check constraint violation occurred.';
    END
GO  

B. @@ERROR를 사용하여 조건부로 프로시저 종료

다음 예에서는 IF...ELSE 문을 사용하여 저장 프로시저에서 DELETE 문 뒤의 @@ERROR를 테스트합니다. @@ERROR 변수의 값은 호출하는 프로그램으로 보내진 반환 코드를 결정하고 프로시저의 성공 여부를 나타냅니다.

USE AdventureWorks2022;  
GO  
-- Drop the procedure if it already exists.  
IF OBJECT_ID(N'HumanResources.usp_DeleteCandidate', N'P') IS NOT NULL  
    DROP PROCEDURE HumanResources.usp_DeleteCandidate;  
GO  
-- Create the procedure.  
CREATE PROCEDURE HumanResources.usp_DeleteCandidate   
    (  
    @CandidateID INT  
    )  
AS  
-- Execute the DELETE statement.  
DELETE FROM HumanResources.JobCandidate  
    WHERE JobCandidateID = @CandidateID;  
-- Test the error value.  
IF @@ERROR <> 0   
    BEGIN  
        -- Return 99 to the calling program to indicate failure.  
        PRINT N'An error occurred deleting the candidate information.';  
        RETURN 99;  
    END  
ELSE  
    BEGIN  
        -- Return 0 to the calling program to indicate success.  
        PRINT N'The job candidate has been deleted.';  
        RETURN 0;  
    END;  
GO  

C. @@ERROR를 @@ROWCOUNT와 함께 사용

다음 예에서는 @@ERROR@@ROWCOUNT와 함께 사용하여 UPDATE 문 작업의 유효성을 검사합니다. @@ERROR의 값을 확인하여 오류 표시가 있는지 검사하고 @@ROWCOUNT를 사용하여 업데이트가 테이블의 행에 제대로 적용되었는지 확인합니다.

USE AdventureWorks2022;  
GO  
IF OBJECT_ID(N'Purchasing.usp_ChangePurchaseOrderHeader',N'P')IS NOT NULL  
    DROP PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader;  
GO  
CREATE PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader  
    (  
    @PurchaseOrderID INT  
    ,@BusinessEntityID INT  
   )  
AS  
-- Declare variables used in error checking.  
DECLARE @ErrorVar INT;  
DECLARE @RowCountVar INT;  
  
-- Execute the UPDATE statement.  
UPDATE PurchaseOrderHeader   
    SET BusinessEntityID = @BusinessEntityID   
    WHERE PurchaseOrderID = @PurchaseOrderID;  
  
-- Save the @@ERROR and @@ROWCOUNT values in local   
-- variables before they are cleared.  
SELECT @ErrorVar = @@ERROR  
    ,@RowCountVar = @@ROWCOUNT;  
  
-- Check for errors. If an invalid @BusinessEntityID was specified,  
-- the UPDATE statement returns a foreign key violation error #547.  
IF @ErrorVar <> 0  
    BEGIN  
        IF @ErrorVar = 547  
            BEGIN  
                PRINT N'ERROR: Invalid ID specified for new employee.';  
                 RETURN 1;  
            END  
        ELSE  
            BEGIN  
                PRINT N'ERROR: error '  
                    + RTRIM(CAST(@ErrorVar AS NVARCHAR(10)))  
                    + N' occurred.';  
                RETURN 2;  
            END  
    END  
  
-- Check the row count. @RowCountVar is set to 0   
-- if an invalid @PurchaseOrderID was specified.  
IF @RowCountVar = 0  
    BEGIN  
        PRINT 'Warning: The BusinessEntityID specified is not valid';  
        RETURN 1;  
    END  
ELSE  
    BEGIN  
        PRINT 'Purchase order updated with the new employee';  
        RETURN 0;  
    END;  
GO  

참고 항목

TRY...CATCH(Transact-SQL)
ERROR_LINE(Transact-SQL)
ERROR_MESSAGE(Transact-SQL)
ERROR_NUMBER(Transact-SQL)
ERROR_PROCEDURE(Transact-SQL)
ERROR_SEVERITY(Transact-SQL)
ERROR_STATE(Transact-SQL)
@@ROWCOUNT(Transact-SQL)
sys.messages(Transact-SQL)
오류 및 이벤트 참조(데이터베이스 엔진)