다음을 통해 공유


END CONVERSATION(Transact-SQL)

업데이트: 2007년 9월 15일

기존 대화의 한 쪽을 종료합니다.

구문

END CONVERSATION conversation_handle
   [   [ WITH ERROR = failure_code DESCRIPTION = 'failure_text' ]
     | [ WITH CLEANUP ]
    ]
[ ; ]

인수

  • conversation_handle
    종료할 대화의 대화 핸들입니다.
  • WITH ERROR = failure_code
    오류 코드입니다. failure_code의 유형은 int입니다. 오류 코드는 대화의 다른 쪽으로 보낸 오류 메시지에 포함되는 사용자 정의 코드입니다. 오류 코드는 0보다 커야 합니다.
  • DESCRIPTION = failure_text
    오류 메시지입니다. failure_text의 유형은 **nvarchar(3000)**입니다. 오류 텍스트는 다른 쪽의 대화로 보낸 오류 메시지에 포함되는 사용자 정의 텍스트입니다.
  • WITH CLEANUP
    정상적으로 완료할 수 없는 대화의 한 측에 대한 모든 메시지 및 카탈로그 뷰 항목을 제거합니다. 이러한 정리는 대화의 다른 측에는 알려지지 않습니다. Microsoft SQL Server는 서비스 큐에서 대화 끝점, 전송 큐의 대화에 대한 모든 메시지, 서비스 큐의 대화에 대한 모든 메시지를 삭제합니다. 관리자는 이 옵션을 사용하여 정상적으로 완료할 수 없는 대화를 제거할 수 있습니다. 예를 들어 원격 서비스가 영구적으로 제거된 경우 관리자는 WITH CLEANUP을 사용하여 해당 서비스에 대한 대화를 제거할 수 있습니다. Service Broker 응용 프로그램의 코드에서 WITH CLEANUP을 사용하지 마십시오. 수신 끝점에서 메시지 수신을 승인하기 전에 END CONVERSATION WITH CLEANUP이 실행되면 전송 끝점에서 메시지를 다시 보내게 됩니다. 이 경우 대화가 다시 실행될 수 있습니다.

주의

대화를 종료하면 제공된 conversation_handle이 속하는 대화 그룹이 잠깁니다. 대화가 종료되면 Service Broker는 서비스 큐에서 모든 대화 메시지를 제거합니다.

대화가 종료되면 응용 프로그램은 해당 대화의 메시지를 더 이상 보내거나 받을 수 없습니다. 대화 참가자 모두 END CONVERSATION을 호출하여 대화를 완료해야 합니다. 대화의 다른 참가자로부터 종료 대화 메시지나 오류 메시지를 받지 못한 경우 Service Broker는 대화의 다른 참가자에게 대화가 종료되었음을 알립니다. 이런 경우 대화 핸들이 더 이상 유효하지 않아도 대화의 끝점은 원격 서비스를 호스팅하는 인스턴스가 메시지를 승인할 때까지 활성 상태로 유지됩니다.

대화에 대한 종료 대화 또는 오류 메시지를 아직 처리하지 않은 경우 Service Broker는 원격 대화 상대에게 종료되었음을 알립니다. Service Broker가 원격 서비스에 보내는 메시지는 지정한 옵션에 따라 다릅니다.

  • 옵션 없이 대화가 종료되고 원격 서비스에 대한 대화가 아직 활성 상태인 경우 Service Broker는 원격 서비스로 https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog 유형의 메시지를 보냅니다. Service Broker는 이 메시지를 대화 순서에 따라 전송 큐에 추가합니다. Service Broker는 이 메시지를 보내기 전에 현재 전송 큐에 있는 이 대화에 대한 모든 메시지를 보냅니다.
  • 오류가 발생하여 대화가 종료되고 원격 서비스에 대한 대화가 아직 활성 상태인 경우 Service Broker는 원격 서비스로 https://schemas.microsoft.com/SQL/ServiceBroker/Error 유형의 메시지를 보냅니다. Service Broker는 현재 전송 큐에 있는 이 대화에 대한 다른 모든 메시지를 삭제합니다.
  • WITH CLEANUP 절을 사용하여 데이터베이스 관리자는 정상적으로 완료할 수 없는 대화를 제거할 수 있습니다. 이 옵션은 대화의 모든 메시지와 카탈로그 뷰 항목을 제거합니다. 이 경우 대화의 원격 상대는 대화가 종료되었다는 어떠한 알림도 받지 못하며, 응용 프로그램에서 보냈지만 네트워크를 통해 아직 전송되지 않은 메시지를 받지 못할 수 있습니다. 따라서 대화를 정상적으로 완료할 수 없는 경우에는 이 옵션을 사용하지 않는 것이 좋습니다.

대화가 종료된 후 대화 핸들을 지정하는 Transact-SQL SEND 문에서 Transact-SQL 오류가 발생합니다. 대화의 다른 쪽에서 이 대화에 대한 메시지가 도착하면 Service Broker는 해당 메시지를 무시합니다.

원격 서비스에 아직 보내지 않은 대화 메시지가 있을 때 대화가 종료되면 원격 서비스는 보내지 않은 메시지를 삭제합니다. 이런 경우는 오류로 간주되지 않으며 원격 서비스는 메시지가 삭제되었다는 알림을 받지 않습니다.

WITH ERROR 절에 지정된 오류 코드는 양수여야 합니다. 음수는 Service Broker 오류 메시지용으로 예약됩니다. Service Broker 오류 메시지에 대한 자세한 내용은 Broker 메시지를 참조하십시오.

END CONVERSATION은 사용자 정의 함수에 유효하지 않습니다.

사용 권한

활성 대화를 종료하려면 현재 사용자가 대화의 소유자, sysadmin 고정 서버 역할의 멤버 또는 db_owner 고정 데이터베이스 역할의 멤버여야 합니다.

sysadmin 고정 서버 역할의 멤버 또는 db_owner 고정 데이터베이스 역할의 멤버는 WITH CLEANUP을 사용하여 이미 완료된 대화에 대한 메타데이터를 제거할 수 있습니다.

1. 대화 종료

다음 예에서는 @dialog_handle이 지정한 대화 상자를 종료합니다.

END CONVERSATION @dialog_handle ;

2. 오류가 발생하여 대화 종료

다음 예에서는 처리문이 오류를 보고할 경우 오류가 발생하여 @dialog_handle이 지정한 대화 상자를 종료합니다. 이는 가장 간단한 오류 처리 방법이지만 일부 응용 프로그램에는 적합하지 않을 수 있습니다.

DECLARE @dialog_handle UNIQUEIDENTIFIER,
        @ErrorSave INT,
        @ErrorDesc NVARCHAR(100) ;
BEGIN TRANSACTION ;

<receive and process message>

SET @ErrorSave = @@ERROR ;

IF (@ErrorSave <> 0)
  BEGIN
      ROLLBACK TRANSACTION ;
      SET @ErrorDesc = N'An error has occurred.' ;
      END CONVERSATION @dialog_handle 
      WITH ERROR = @ErrorSave DESCRIPTION = @ErrorDesc ;
  END
ELSE

COMMIT TRANSACTION ;

3. 정상적으로 완료할 수 없는 대화 정리

다음 예에서는 @dialog_handle이 지정한 대화 상자를 종료합니다. SQL Server는 원격 서비스에게 알리지 않고 서비스 큐와 전송 큐에서 모든 메시지를 즉시 제거합니다. 정리를 사용하여 대화 상자를 종료하면 원격 서비스에 알리지 않으므로 이 방법은 원격 서비스가 EndDialog 또는 Error 메시지를 받을 수 없는 경우에만 사용해야 합니다.

END CONVERSATION @dialog_handle WITH CLEANUP ;

참고 항목

참조

BEGIN CONVERSATION TIMER(Transact-SQL)
BEGIN DIALOG CONVERSATION(Transact-SQL)
sys.conversation_endpoints(Transact-SQL)

관련 자료

Broker 메시지
대화 기능
Service Broker 자습서

도움말 및 정보

SQL Server 2005 지원 받기

변경 내역

릴리스 내역

2007년 9월 15일

변경된 내용
  • WITHOUT CLEANUP 사용 방법에 대한 자세한 설명을 추가했습니다.