2017-02-17 144 views
1

我運行下面的查詢是這樣的:SQL服務器雖然語句錯誤

WHILE (SELECT CONVERT(NVARCHAR, disburse_date, 112) FROM TEST_LOOP) <> 201701 
BEGIN 
    UPDATE TEST_LOOP 
    SET disburse_date = DATEADD(DD, 14, disburse_date) 

    SELECT * FROM TEST_LOOP 

    IF (SELECT CONVERT(NVARCHAR, disburse_date, 112) FROM TEST_LOOP) = 201701 
     BREAK 
END 

而且我得到以下錯誤:

子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

我試過評估我的查詢,但尚未解決。任何建議將不勝感激。

謝謝..

+0

你的代碼有這麼多問題,沒有地方可以開始。問另一個問題和(1)提供樣本數據; (2)顯示你想要的結果;和(3)解釋你正在嘗試做什麼。 –

+0

你是否試圖更新表中的所有記錄,以便他們所有的'disburse_date'到達Jan2017? – ydoow

+0

@ydoow是的..是否有可能使用while語句? –

回答

1

假設您想要更新所有記錄,以便disburse_date到達2017年1月。

爲了使它更具可讀性,我會先創建一個函數。

-- function to return a date reaching Jan2017 with an incremental of 14 days from input date 
CREATE FUNCTION fn_DateReaching201701 
( 
    @in_date AS DateTime  
) 
RETURNS DateTime 
AS 
BEGIN 

    DECLARE @out_date AS DateTime 
    SET @out_date = @in_date 

    WHILE (CONVERT(NVARCHAR(6),@out_date,112) != 201701) 
    BEGIN 
      set @out_date = DATEADD(day, 14, @out_date) 
    END 

    RETURN @out_date 
END 

然後,應用正常的更新語句。另外的WHERE條款是爲了確保所有記錄都在2017年1月之前,以避免無限循環。

UPDATE TEST_LOOP 
SET disburse_date = dbo.fn_DateReaching201701(disburse_date) 
WHERE disburse_date < '2017-02-01' 
+0

謝謝你的伴侶。它工作正常.. :) –

0

這是你想要做的嗎?

UPDATE TEST_LOOP 
    SET TGL_AWAL_KREDIT = DATEADD(DAY, 14, TGL_AWAL_KREDIT) 
    WHERE TGL_AWAL_KREDIT < '20170101'; 

注意:沒有WHILE循環。

+0

我想循環一天,直到2017年1月到達.TGL_AWAL_KREDIT字段中的日期樣本爲'2015-05-27 00:00:00.000'。 –

+0

@AfifPratama。 。 。如果基於集合的方法解決了問題,沒有理由循環。 –