子查询返回多个值:DateTime

WCh*_*ers 2 sql sql-server datetime sql-update

我试图在单个表中调整多行以节省夏令时.我需要在捕获错误之前为写入的任何记录添加一个小时.我收到了错误

Subquery returns more than 1 value. This is not permitted when the subquery follows =, != etc
Run Code Online (Sandbox Code Playgroud)

我理解它告诉我的是什么,我只是想不出办法.这就是我想要做的:

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

我也尝试了变化并收到了同样的错误.

UPDATE Table
SET LocalDateTime = LocalDateTime + '1:00:00'
WHERE DateWritten IN (SELECT DateWritten FROM Table WHERE (same clause as above))
Run Code Online (Sandbox Code Playgroud)

Seb*_*ine 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
Run Code Online (Sandbox Code Playgroud)

来源MSDN(有调整).

这应该可以解决你当前的问题.但请记住:

  1. 你真的应该修复触发器,因为它可能会导致其他问题.
  2. 游标要小心.我认为他们是一场表演噩梦.我是像你这样的一次性更新,但它们是可以接受的.