-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
変数をカーソルに動的に割り当てるにはどうすればよいですか?
https://msdn.microsoft.com/en-us/library/ms174420([DATEPART(DW、)]をご覧ください。 aspx) –
McNets
このような関数は、特にカーソルを内部で使用する場合、非常に非効率的です。これは、非常に簡単に非カーソルバージョンとして書き直すことができます。 – DavidG
正常に動作します。デバッグ時、 '@day_code'は正しい値を持っていますが、カーソルには渡されません –