2016-06-07 2 views
0

저장 프로 시저의 특정 인스턴스가 실행 중인지 확인하는 방법을 찾고 있습니다.현재 실행중인 저장 프로 시저 핸들 얻기

예를 들어, 오랜 시간 동안 실행하는 것으로 알려진 프로 시저 foo가 있다고 가정 해 봅니다. foo를 프로세스 A의 일부로 시작하고 조금 나중에 프로세스 B의 일부로 foo의 별도 인스턴스를 시작합니다.이 프로세스는 해당 저장 프로 시저를 시작하는 외부 객체 일 수 있습니다.

나중에 foo가 실행 중인지 확인할 수 있어야하지만, 프로세스 A에서 시작한 foo의 인스턴스가 아직 실행 중인지 구체적으로보고 싶습니다.

나는 sproc의 인스턴스가 실행 중인지 확인하기 위해 여러 가지 솔루션을 보았지만 특정 인스턴스와 관련하여 아무 것도 보지 못했습니다.

CREATE PROCEDURE foo 
AS 
BEGIN 
    INSERT INTO fooWorkLog (handle) 
    VALUES (@@MagicValueTellingMeTheSpecificHandleOfThisInstanceOfTheSproc) 

    -- do other stuff 
END 

-- One Process does this 

EXEC foo --let's say we know this has handle 123 

-- Meanwhile another process does this 

EXEC foo --let's say we know this has handle 789 

-- A little bit later, from a different process 
DECLARE @TheHandleImLookingFor INT = 123 
SELECT ActiveHandle FROM SqlServersListOfActiveHandles 
WHERE ActiveHandle = @TheHandleImLookingFor 

어떤 아이디어 :

는 여기에 마법 fakey 코드에 바라던 벽돌 쌓는 사람입니까?

추가 정보

의 I 그러나 Check if stored procedure is running

부탁 해요 무엇을 올리기이 틀리지 않는 한, 해당 솔루션이 SPROC가 실행되고 있는지를 알 수 있지만,이하는 유사하다 SO 다음 실행중인 sproc의 인스턴스가 특정 컨텍스트에서 실행 된 인스턴스인지 알려주지 마십시오.

솔루션을 사용하여 하나의 컨텍스트 (A)에서 sproc을 시작한 다음 다른 컨텍스트 (B)에서 sproc을 다시 시작했다고 가정 해 봅시다. 나중에 일정 기간 동안 두 인스턴스 중 하나만 실행 중이라고 가정 해 봅시다. 다른 게시물의 예를 따르면 sproc가 실제로 실행되고 있다고 나에게 알리 겠지만 문맥 A의 sproc인지 컨텍스트 B의 sproc인지는 알 수 없습니다.

나는 실수 일 수 있습니다. 하지만 매번 SQL Server가 각 인스턴스에 일종의 핸들 ID를 부여한 sproc을 실행한다고 생각했습니다. sproc가 실행중인 핸들을 식별하고 그 핸들을 참조 용으로 테이블에 저장하는 방법이 있는지 궁금합니다.

아직 명확하지 않은 경우 다른 예로 다시 시도 할 수 있습니다.

+0

당신이 새 GUID를 사용할 수 있습니다() 삽입 및 좀 더 자세한 질문을주고 – Ajay2707

+0

두 과정 사이의 명확한 단락 지을 줄이 명확하지 않을 때 고유있다. –

+0

@sandeeprawat 더 많은 설명을 추가했지만 아직 명확하지 않을 수 있습니다. 더 나은 예를 원한다면 알려주세요. – Joe

답변

0

나는 프로 시저 핸들을 얻는 데별로 신경 쓰지 않지만, 해결 방법은 직접 컨트롤을 작성하는 것입니다.

프로세스 정보를 저장할 테이블이있는 경우 "tb_ProcedureControl"이라고 말하면 프로 시저가 시작될 때 레코드를 삽입 한 다음 프로 시저가 끝날 때 종료 날짜를 설정할 수 있습니다. 예를 들어

:

CREATE PROCEDURE MyProc 
    @param1... 
    ,@param2... 
    ,@InstanceInfo = NULL --Optional parameter 
AS 
BEGIN 
    --create the record for the instance 
    INSERT INTO tb_ProcedureControl (InstanceInfo, Start, End) VALUES (@InstanceInfo, getdate(), null) 


    <TASK TO DO> 

    --set the end of the process 
    UPDATE tb_ProcedureControl SET End = GETDATE() 
    WHERE InstanceInfo = @InstanceInfo 

END