我运行以下查询:
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; =或子查询用作表达式时,不允许这样做。
我试过评估我的查询但尚未解决。任何建议都将不胜感激。
谢谢..
答案 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
循环。