2017-02-26 30 views
-2

在以下函數中,我在遊標中使用了一個變量 - @day_code,並在while循環的執行期間獲得了不同的值。動態地爲遊標分配一個變量 - SQL Server

DECLARE @curr_date DATE = GETDATE() 
    DECLARE @curr_day VARCHAR(10) 
    DECLARE @day_code VARCHAR(1) 
    DECLARE @cnt INT = 0 
    DECLARE @exist INT = 0 

    DECLARE test_cur CURSOR FOR 
     SELECT 1 
     FROM work_cal_time wct 
     WHERE wct.day_code = @day_code 

    WHILE @cnt < 3 
     BEGIN 
      SET @curr_date = DATEADD(day, -1, @curr_date) 
      SET @curr_day = DATENAME(weekday, @curr_date) 
      SET @day_code = 
       CASE @curr_day 
        WHEN 'Sunday' THEN '1' 
        WHEN 'Monday' THEN '2' 
        WHEN 'Tuesday' THEN '3' 
        WHEN 'Wednesday' THEN '4' 
        WHEN 'Thursday' THEN '5' 
        WHEN 'Friday' THEN '6' 
        WHEN 'Saturday' THEN '7' 
       END 

      OPEN test_cur 
      FETCH test_cur INTO @exist 
      CLOSE test_cur 

      IF @exist = 0 CONTINUE 

      SET @exist = 0 
      SET @cnt = @cnt + 1; 
     END; 

    RETURN(@curr_date) 
END 

但是,看起來變量@day_code的值沒有被光標拾取。 但是,如果我初始化@day_code而不是動態分配值,它可以正常工作。 即

CREATE FUNCTION [dbo].[test]() 
RETURNS DATE 
AS 
    BEGIN 

    DECLARE @curr_date DATE = GETDATE() 
    DECLARE @curr_day VARCHAR(10) 
    DECLARE @day_code VARCHAR(1) = '1' 
    DECLARE @cnt INT = 0 
    DECLARE @exist INT = 0 

    DECLARE test_cur CURSOR FOR 
     SELECT 1 
     FROM work_cal_time wct 
     WHERE wct.day_code = @day_code 

    WHILE @cnt < 3 
     BEGIN 
      SET @curr_date = DATEADD(day, -1, @curr_date) 
      SET @curr_day = DATENAME(weekday, @curr_date) 

      OPEN test_cur 
      FETCH test_cur INTO @exist 
      CLOSE test_cur 

      IF @exist = 0 CONTINUE 

      SET @exist = 0 
      SET @cnt = @cnt + 1; 
     END; 

    RETURN(@curr_date) 
END 

如何動態地爲光標指定一個變量?

+0

請看看[DATEPART(DW,)(https://msdn.microsoft.com/en-us/library/ms174420。 aspx) – McNets

+2

像這樣的函數效率很低,特別是當你使用遊標時。這可以很容易地被重寫爲非遊標版本。 – DavidG

+0

它工作正常。當我調試時,雖然'@day_code'具有正確的值,但它不會傳遞給遊標 –

回答

0

試着改變你的WHILE循環到這一點:

WHILE @cnt < 3 
    BEGIN 
     SET @curr_date = DATEADD(day, -1, @curr_date) 
     SET @curr_day = DATENAME(weekday, @curr_date) 
     SET @day_code = DATEPART(dw,@curr_date) 

     OPEN test_cur 
     FETCH test_cur INTO @exist 
     CLOSE test_cur 

     IF @exist = 0 CONTINUE 

     SET @exist = 0 
     SET @cnt = @cnt + 1; 
    END;