2016-08-23 2 views
2

SQL Server에서 커서를 반복 할 때 마지막 행을 아는 방법은 무엇입니까?SQL Server에서 커서를 반복 할 때 마지막 행을 아는 방법은 무엇입니까?

나는 카운터와 @@CURSOR_ROWS@@FETCH_STATUS으로 시도했지만 제대로 작동하지 않거나 적절한 방법으로 사용하지 않았습니다.

편집 :

음, 그래, 각 루프의 끝 부분에 쉼표와 문자열 ... ,를 구성. 물론, 돌아 오기 전에 나는 , 일 것 인 마지막 특성을 끊을 수있다. 그러나 나는 이것이 유일한 길인지 궁금하게 생각하고있다?

그러나 많은 상황이 있으며 마지막 행을 인식하는 방법을 알고있는 것이 좋습니다.

+0

이 정보는 무엇에 사용됩니까? 마지막 문제보다는 * 처음 * 행에 특별한 것을하도록 문제를 변형시킬 수 있습니까? (고전적인 예 - 요소 사이에 쉼표 추가하기. 마지막 행을 제외하고 모두에 쉼표를 추가하는 대신 쉼표를 앞에두고 쉼표를 붙이도록 논리를 변경하십시오.) –

+0

@Damien_The_Unbeliever 편집 내용을 참조하십시오. – dllhell

답변

3

의견에서 제안한대로 요소 사이에 쉼표를 넣는 것은 마지막이 아닌 첫 번째 행에 대해 특별한 작업을 수행함으로써 훨씬 쉽게 실현됩니다.

SET @first = 1 
WHILE @@FETCH_STATUS=0 
BEGIN 
    IF @first = 1 
     SET @first = 0 
    ELSE 
     SET @value = @value + ',' 

    SET @value = @value + @newelement 

    ... 
END 

또 다른 변화를 : 1, 2

오히려

WHILE @@FETCH_STATUS=0 
BEGIN 
    SET @value = @value + @newelement + ',' 

    ... 
END 

그리고 특별히 마지막 행을 처리하는 방법을 해결하려고 노력보다, 그것을 할 훨씬 쉽게 , 만약 당신이 정말로 마지막 행을 위해 뭔가를해야 할 중간 변수와 비표준 커서를 사용하는 것입니다 루프 :

declare boris cursor for select top 10 name from sys.objects order by name 

declare @name sysname 
declare @nametemp sysname 

open boris 
fetch next from boris into @nametemp 
while @@FETCH_STATUS=0 
BEGIN 
    set @name = @nametemp --Use SELECT if multiple variables to be assigned 

    fetch next from boris into @nametemp 

    if @@FETCH_STATUS!=0 
    begin 
     print 'and finally' 
    end 

    print @name 
END 

close boris 
deallocate boris 

인쇄는 (나를 위해, 거의 빈 DB에) 어느 :

EventNotificationErrorsQueue 
filestream_tombstone_2073058421 
filetable_updates_2105058535 
IsIt 
QueryNotificationErrorsQueue 
queue_messages_1977058079 
queue_messages_2009058193 
queue_messages_2041058307 
ServiceBrokerQueue 
and finally 
sysallocunits 

하지만 난 강력하게 대신 변화의 첫 번째 유형을 권 해드립니다.


1이 어느 단지 T-SQL의 일이 아니다. 당신이 커서가되는 대한 일반적인 경고를

2 "를 다르게 첫 번째 반복 치료"로 "다른 마지막 반복 치료"에서 문제를 변화 그리고, 물론, 삽입 할 수있는 경우 대부분의 프로그래밍 언어에서는 일반적으로 훨씬 쉽게 SQL의 최후의 수단으로, 부적절한 것으로 판명 될 때까지 또는 그 때까지 세트 기반 접근법을 사용하십시오.

+0

네가 맞다는 것을, 당신이 제안한대로 할 것이지만, 어떤 이유로 마지막 행 전에 storproc을 실행할 필요가 있다면 어떻게해야할까요? – dllhell

+0

@dllhell - 대안을 제시했지만, 아마도 첫 번째 유형의 변형을 발견 할 수 있다면 그것을 추천 할 수 있습니다. –

관련 문제