我正在尝试在单个表格中为夏令时调整多行。我需要在捕获错误之前为写入的任何记录添加一个小时。我收到了错误
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))
答案 0 :(得分:5)
您很可能在该表上有一个触发器,它以无法处理多行更新的方式编写。如果是这种情况,请修复触发器,或使用游标进行更新。
此外,正如其他人所提到的,您无法使用+
运算符进行时间计算。请改用DATEADD
。
只是为了澄清:您的更新不会导致您获得的错误。最可能的原因是由其他人实施的触发器。您可以在表格下看到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 :(得分: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'
基于this article,您可能会在视图中使用Table
,这可能会阻止更新多个记录。