SQL Server While语句错误

时间:2017-02-17 02:56:39

标签: sql sql-server sql-server-2008

我运行以下查询:

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

我收到以下错误:

  

子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;,&gt; =或子查询用作表达式时,不允许这样做。

我试过评估我的查询但尚未解决。任何建议都将不胜感激。

谢谢..

2 个答案:

答案 0 :(得分: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子句是为了确保所有记录都在Jan2017之前,以避免无限循环。

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

答案 1 :(得分:0)

这是你想要做的吗?

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

注意:没有WHILE循环。

相关问题