2011-03-01 6 views
8

커서를 사용하고 있습니다. TSQL 변경 커서 정의

DECLARE @column1 NVARCHAR(MAX); 

DECLARE cursor_name CURSOR FOR 
    SELECT c1 
    FROM table_name; 

OPEN cursor_name; 
FETCH cursor_name INTO @column1; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    FETCH cursor_name INTO @column1; 
END 

CLOSE cursor_name; 
DEALLOCATE cursor_name; 

이제 내 질문에 나는 그것을 사용 후 커서 cursor_name의 정의를 변경할 수있다? 나는 비슷한 의미 : 같은 커서 이름 cursor_name을 사용

DECLARE cursor_name CURSOR FOR 
    SELECT c2 
    FROM table_name2; 

을하지만, 해상력이 변경됩니다. 이것이 가능한 경우 어떻게 수행합니까?

감사합니다.

답변

10

Yes it's possible,하지만 귀하가 그것을 해제 한 후에야합니다. 이것을 시도해 보았지만 작동하지 않습니까?

정말로 커서가 필요한지 여부를 살펴볼 수도 있습니다. 그것들은 성능을 해치고 그것들을 사용하는 SQL은 그것들없이 자주 재 작성 될 수 있습니다.

어떻게 수행할까요? this article을보세요. 커서를 선언하는 데 덜 공통적 인 DECLARE/SET 구문을 사용합니다 (적어도 내 세계에서는 드문 경우). 아베 Miessler가 커서 성능에 대한 의견을 오해의 소지에

USE pubs 
GO 
DECLARE @MyCursor CURSOR 
SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM titles 

DEALLOCATE @MyCursor 

SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM sales 
GO 
4

단순한 기술적 관점에서 커서가 필요한지 여부에 대한 설명을 피하고 커서가 닫히고 할당이 해제되면 다시 이름을 다시 사용할 수 있습니다.

-1

수정 : 저장 시저와 트리거에 포함 된 경우

거래-SQL 커서 매우 효율적인 여기에 그들이 제공하는 예입니다. 모든 것이 서버에 하나의 실행 계획으로 컴파일 가져 오는 행

  • 참조 msdn article에서 추출과 관련된 네트워크 트래픽 가 없기 때문입니다.

성능에 좋지 않은 점은 저장된 proc 파일 밖에서 다음 행에 대한 전역 커서를 반복적으로 호출하는 것입니다. 클라이언트 라운드 업을 줄이기 위해 API를 사용하는 것이 더 좋습니다.

당신은 프로그램 변수에 FETCH에 의해 반환되는 각 열을 바인딩 FETCH 사용하고 에 의해 응용 프로그램에서 거래-SQL 커서를 사용할 수 있습니다. 그러나 Transact-SQL FETCH는 일괄 처리를 지원하지 않으므로 응용 프로그램에 데이터를 반환하는 가장 효율적인 방법은 입니다. 각 행을 가져 오려면 서버로 왕복해야합니다. 행을 가져 오는 을 지원하는 데이터베이스 API에 내장 된 커서 기능을 사용하는 것이 더 효율적입니다.