2

我正在尝试在单个表中调整多行夏令时。我需要在发现错误之前写入的所有记录中增加一个小时。我收到错误

Subquery returns more than 1 value. This is not permitted when the subquery follows =, != etc

我明白它在告诉我什么,我只是想不出解决办法。这就是我想要做的:

UPDATE Table
SET LocalDateTime = LocalDateTime + '1:00:00'
WHERE (DateWritten > '3/10/13') AND (DateWritten < '3/11/13 7:00:00') AND (varCharColumn <> 'aString')

我也尝试了这种变化并收到了同样的错误。

UPDATE Table
SET LocalDateTime = LocalDateTime + '1:00:00'
WHERE DateWritten IN (SELECT DateWritten FROM Table WHERE (same clause as above))
4

2 回答 2

5

您很可能在该表上有一个触发器,该触发器的编写方式无法处理多行更新。如果是这种情况,要么修复触发器,要么使用游标进行更新。

此外,正如其他人所提到的,您不能使用+运算符进行时间计算。改为使用DATEADD


只是为了澄清:您的 UPDATE 不会导致您遇到的错误。最可能的原因是其他人设置的触发器。您可以在表格本身下方看到 SSMS 中的触发器。看看那里是否有触发器,如果​​有,请发布代码。也许我们可以帮助解决它。

如果您现在不想弄乱触发器,请使用如下光标:

DECLARE complex_cursor CURSOR FOR
    SELECT LocalDateTime
    FROM dbo.Table
    WHERE (DateWritten > '3/10/13') AND (DateWritten < '3/11/13 7:00:00') AND (varCharColumn <> 'aString') ;
OPEN complex_cursor;
FETCH FROM complex_cursor;
WHILE(@@FETCH_STATUS = 0)
BEGIN
  UPDATE dbo.Table
  SET LocalDateTime = DATEADD(hour,1,LocalDateTime) 
  WHERE CURRENT OF complex_cursor;

  FETCH FROM complex_cursor;
END
CLOSE complex_cursor;
DEALLOCATE complex_cursor;
GO

来源MSDN(有调整)。

这应该可以解决您的直接问题。但是请记住:

  1. 您确实应该修复触发器,因为它可能会导致其他问题。
  2. 小心使用游标。我一般来说他们是一场表演噩梦。我是像您这样的一次性更新的情况,但是它们是可以接受的。
于 2013-03-11T14:06:47.760 回答
0

您可以使用DateAdd()

UPDATE Table
SET LocalDateTime = DateAdd(hour,1,LocalDateTime)
WHERE DateWritten > '3/10/13'
AND DateWritten < '3/11/13 7:00:00' 
AND varCharColumn <> 'aString'

或者,您也可以BETWEEN在 DateWritten 列上进行比较

UPDATE Table
SET LocalDateTime = DateAdd(hour,1,LocalDateTime)
WHERE DateWritten BETWEEN '3/10/13'AND '3/11/13 7:00:00' 
AND varCharColumn <> 'aString'

根据这篇文章,看起来您Table的视图可能会阻止更新多条记录。

日期添加文档

于 2013-03-11T14:03:16.077 回答