도움이 될 것입니다. 매우 자주 "Set-based"방식으로 여러 값을 처리하도록 SQL을 수정할 수 있습니다. 즉, 처리 할 값 집합이있는 경우 모두 처리 할 수 있습니다.
이렇게하려면 여러 가지 방법이 있습니다. 구분 된 문자열을 전달한 다음 proc에서 해당 문자열을 구문 분석 할 수 있습니다. 이 구현에 대한 많은 아이디어
또한 XML을 전달하고 APPLY
을 사용하여 proc의 XML에 "조인"할 수도 있습니다.
당신은 내가 당신이 AreaID 매개 변수와 함께 일을하는지 정확히 알고하지 않기 때문에
Table Valued Parameters
, 내가 모르는 사용할 수 있습니다 2008+ SQL에서
내가 지금 여기에 귀하의 질문에 대답 한 경우는 좀 더 정보.
저장 프로 시저를 비동기 적으로 실행하려면 Service Broker를 사용하면 매개 변수를 큐에 넣을 수 있고 별도의 스레드가 큐를 처리 할 수 있습니다. SQL은 모든 순서, 잠금, 다시 시도, 스레드 생성/제거 등을 관리합니다. 매우 견고한 시스템입니다.
진행 추적과 관련하여 OP에 연결되어있는 것으로 보이는 다른 사용자의 질문에 대한 의견이 있습니다. 다음은 생각입니다.
배치 ID와 areaID 매개 변수 및 상태 플래그가 포함 된 "대기열"테이블이 있습니다.귀하의 응용 프로그램 및 호출 (그룹 귀하의 요청)
에 대해 고유 한 배치 ID로 큐 테이블에
CREATE TABLE asynchQueue
(
RecNo INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
BatchID INT,
AreaID INT,
Status TINYINT
)
귀하의 C# 응용 프로그램의 삽입이 같이 정기적으로 실행되도록 예약 발동 있습니다
CREATE PROC ProcessQueue
AS
BEGIN
SET XACT_ABORT ON
DECLARE @RecNo INT,
@AreaId INT
BEGIN TRAN
SELECT TOP 1 @RecNo = recNo,
@AreaID = areaId
FROM AsynchQueue WITH ROWLOCK, XLOCK
WHERE Status = 0
UPDATE AsynchQueue SET Status = 1 --Mark record as in progress
WHERE RecNo = @RecNo
COMMIT
EXEC YourProc @AreaId
UPDATE AsynchQueue SET Status = 2 -- Mark Record as complete
WHERE RecNo = @RecNo
END
을
또는 proc에는 테이블의 모든 레코드를 처리하는 루프가 포함될 수 있습니다. John Weldon이 제안한대로 sp_start_job을 사용하여 필요할 때 proc을 예약하거나 호출 할 수 있습니다. 다음과 같이
그런 상태를 조회 할 수있다 :
SELECT COUNT(NULLIF(Status, 0))/COUNT(*) as PctComplete --in progress or complete div by total
FROM AsynchQueue WITH NOLOCK
WHERE BatchID = @yourBatchId
그 쿼리가 당신에게 당신의 배치의 완료율을 줄 것이다.
아마도 'AreaID'를 여러 개 가져 와서 SQL 서버에서 한 번에 모든 처리를 수행하는 새로운 저장 프로 시저를 작성할 수 있습니다. –
@CoryLarson은 귀하에게 동의했지만 처리 진행 상황을 보여줄 필요가있을 수 있습니다. – Damith