-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
如何動態地爲光標指定一個變量?
請看看[DATEPART(DW,)(https://msdn.microsoft.com/en-us/library/ms174420。 aspx) –
McNets
像這樣的函數效率很低,特別是當你使用遊標時。這可以很容易地被重寫爲非遊標版本。 – DavidG
它工作正常。當我調試時,雖然'@day_code'具有正確的值,但它不會傳遞給遊標 –