Prowadzę następujące zapytanie takie jak:

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

I otrzymuję następujący błąd:

Podzapytanie zwróciło więcej niż 1 wartość. Nie jest to dozwolone, gdy podzapytanie następuje po =,! =, <, <=,>,> = Lub gdy podzapytanie jest używane jako wyrażenie.

Próbowałem ocenić moje zapytanie, a jeszcze nie zostało rozwiązane. Każda rada będzie doceniana.

Dzięki..

1
Afif Pratama 17 luty 2017, 05:56

2 odpowiedzi

Najlepsza odpowiedź

Zakładając, że chcesz zaktualizować wszystkie rekordy, aby disburse_date osiąga się Jan2017.

Aby był bardziej czytelny, stworzyłbym funkcję najpierw.

-- 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

Następnie zastosuj normalne oświadczenie aktualizacji. Dodatkową klauzulą WHERE jest upewnienie się, że wszystkie rekordy są wcześniejsze 17 stycznia, aby uniknąć nieskończonej pętli.

UPDATE TEST_LOOP
SET disburse_date =  dbo.fn_DateReaching201701(disburse_date)
WHERE disburse_date < '2017-02-01'
1
ydoow 17 luty 2017, 03:20

Czy to jest to, co chcesz zrobić?

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

Uwaga: Loop nie ma WHILE.

0
Gordon Linoff 17 luty 2017, 02:59