다음을 통해 공유


@@ERROR(Transact-SQL)

최근에 실행된 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)를 참조하십시오.

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

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

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

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

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

USE AdventureWorks2008R2;
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

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

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

USE AdventureWorks2008R2;
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