2017-02-26 4 views
-2

次の関数では、カーソル内に変数@day_codeを使用しましたが、whileループの実行中に異なる値を取得しています。カーソルに変数を動的に割り当てる -

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

https://msdn.microsoft.com/en-us/library/ms174420([DATEPART(DW、)]をご覧ください。 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; 
関連する問題