2010-07-22 38 views
4
GO 
SET NOCOUNT ON; 

DECLARE 
@idAdvertisements int, 
@Name nvarchar(255), 
@Description nvarchar(500), 
@DepartureDate datetime, 
@Cities_idCities int, 
@Areas_idAreas int, 
@Countries_idCountries int, 
@Agencies_idAgencies int, 
@Url nvarchar(1000), 
@Price decimal(6, 2), 
@HollidayDuration int, 
@BookingDate datetime; 

DECLARE ad_cursor CURSOR 
    FOR SELECT idAdvertisements 
      ,Name 
      ,Description 
      ,DepartureDate 
      ,Cities_idCities 
      ,Areas_idAreas 
      ,Countries_idCountries 
      ,Agencies_idAgencies 
      ,Url 
      ,Price 
      ,HollidayDuration 
      ,BookingDate 
     FROM Advertisements; 

OPEN ad_cursor; 
FETCH NEXT FROM ad_cursor 
INTO @idAdvertisements 
    ,@Name 
    ,@Description 
    ,@DepartureDate 
    ,@Cities_idCities 
    ,@Areas_idAreas 
    ,@Countries_idCountries 
    ,@Agencies_idAgencies 
    ,@Url 
    ,@Price 
    ,@HollidayDuration 
    ,@BookingDate; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT ' '; 
    PRINT @idAdvertisements; 
    --PRINT @Name; 
    --PRINT @Description; 
    --PRINT @DepartureDate; 
    --PRINT @Cities_idCities; 

END 
CLOSE ad_cursor; 

但我總是得到1, 1, 1, 1, 1。數據總是相同的。T-SQL光標不生成預期輸出

SELECT聲明是可以的。我不明白爲什麼。有人可以看到問題嗎?

+5

爲什麼即使打擾一個CURSOR?如果你**必須**使用CURSOR,那麼至少將其定義爲CURSOR FAST_FORWARD以加快它的速度。但**最好的選擇**將是避免全部遊標 - 在90%的情況下,你也可以! – 2010-07-22 12:04:56

+0

與marc_s一致,沒有必要爲此指定遊標。 – gsharp 2010-07-22 12:07:04

+0

裏面有更多的代碼,所以需要curosr。我刪除了一些代碼以便更好地查看。 – senzacionale 2010-07-22 12:09:55

回答

3

遊標是邪惡..邪惡..邪惡..遠離他們

現在,這裏的問題 - 你是不是移動光標前進..

DECLARE ad_cursor CURSOR 
    FOR SELECT idAdvertisements, Name, Description, DepartureDate, Cities_idCities, Areas_idAreas, 
    Countries_idCountries, Agencies_idAgencies, Url, Price, HollidayDuration, BookingDate FROM Advertisements; 

OPEN ad_cursor; 
FETCH NEXT FROM ad_cursor 
INTO @idAdvertisements, @Name, @Description, @DepartureDate, @Cities_idCities, @Areas_idAreas, 
@Countries_idCountries, @Agencies_idAgencies, @Url, @Price, @HollidayDuration, @BookingDate; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT ' '; 
    PRINT @idAdvertisements; 
    --PRINT @Name; 
    --PRINT @Description; 
    --PRINT @DepartureDate; 
    --PRINT @Cities_idCities; 

    FETCH NEXT FROM ad_cursor 
    INTO @idAdvertisements, @Name, @Description, @DepartureDate, @Cities_idCities, @Areas_idAreas, 
    @Countries_idCountries, @Agencies_idAgencies, @Url, @Price, @HollidayDuration, @BookingDate; 


END 
CLOSE ad_cursor; 
3

你在這裏的代碼將循環無限。您需要在WHILE循環的正文末尾再添加一個FETCH,否則@@FETCH_STATUS將永遠不會更改。

2
OPEN ad_cursor; 
FETCH NEXT FROM ad_cursor 
INTO @idAdvertisements, @Name, @Description, @DepartureDate, @Cities_idCities, @Areas_idAreas, 
@Countries_idCountries, @Agencies_idAgencies, @Url, @Price, @HollidayDuration, @BookingDate; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT ' '; 
    PRINT @idAdvertisements; 
    --PRINT @Name; 
    --PRINT @Description; 
    --PRINT @DepartureDate; 
    --PRINT @Cities_idCities; 
FETCH NEXT FROM ad_cursor 
INTO @idAdvertisements, @Name, @Description, @DepartureDate, @Cities_idCities, @Areas_idAreas, 
@Countries_idCountries, @Agencies_idAgencies, @Url, @Price, @HollidayDuration, @BookingDate; 
END 
CLOSE ad_cursor; 

您已添加抓取下一行,就在END之前