2011-10-05 1 views
2

@workingSet이라는 테이블 변수를 통해 SQL Server 2005 커서가 작동하고 있습니다.커서 원본 SQL Server에서 행 삭제

일부 행은 관련 될 수 있으며이 경우에는 내가 가져온 행과 관련 행을 동시에 처리합니다. 그런 다음 루프에서 처리 할 필요가 없으므로 관련 레코드를 @workingset에서 제거합니다.

7 행이있는 @workingSet에서는 첫 번째 두 개가 관련되어 있으므로 1을 처리 할 때도 2를 처리합니다. 커서 소스 (@workingSet)에서 행 2를 제거한 후 다음을 가져옵니다. 문제는 두 번째 행을 @workingset (이전 반복에서 삭제 한 행)으로 반환한다는 것입니다.

커서가 작동하는 소스에서 항목을 삭제하면 이후 가져 오기에서 해당 항목을 삭제할 수 있다는 인상을주었습니다.

도움을 주시면 감사하겠습니다.

+1

우리가하고있는 것을 보여줄 수 있습니까 ?? ** 최고 ** 옵션은 모든 경우의 90 % 이상에서 가능한 커서를 제거하는 것입니다 ... –

+0

고마워하고 네 말이 맞아 .. 그리고 나는 여전히 커서가 필요하다는 것을 확신하지 못합니다. 그러나 그것이 가능하다는 것을 아는 것에 더 관심이있었습니다. –

답변

1

커서의 소스로 사용되는 테이블 변수에는 기본 키가 있어야합니다. 나는이 모든 것을 올바르게 추가했다.

+0

제 대답의 표에 PK가없고'DELETE'의 결과가 올바르게 반영됩니다. –

+0

안녕하세요. 예. PK없이 개념 증명을 할 수 있었고 올바르게 작동했습니다. 왜 다른 경우에는 그것이 필요한지 나는 모른다. –

+0

다른 커서 옵션을 설정 했습니까? –

0

커서에 익숙하지 않지만 빠른 테스트에서는 STATIC 또는 KEYSET 옵션을 사용하여 커서를 선언하지 않아도되므로 원본 테이블의 변경 사항이 커서에 반영됩니다.

SET NOCOUNT ON; 

DECLARE @WorkingTable TABLE(C int) 

INSERT INTO @WorkingTable VALUES (1),(2),(3) 

DECLARE @C int 

DECLARE wt_cursor CURSOR 
DYNAMIC /*Or left blank but not STATIC or KEYSET*/ 
FOR 
SELECT C 
FROM @WorkingTable 

OPEN wt_cursor; 

FETCH NEXT FROM wt_cursor 
INTO @C 

DELETE FROM @WorkingTable 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @C; 


    FETCH NEXT FROM wt_cursor 
    INTO @C; 
END 
CLOSE wt_cursor; 
DEALLOCATE wt_cursor; 
+0

고마워 .. 네. 커서가 STATIC 또는 KEYSET으로 선언되지 않았습니다. –

+0

@ Simon - 내 답변에서 코드를 실행하지만 '동적'옵션을 삭제하면 어떻게됩니까? 내 대답은 단지'1,2,3'이 아닌'1'을 반환합니다. –