sql - 子查询返回超过 1 个值 : DateTime

标签 sql sql-server datetime sql-update

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

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))

最佳答案

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

此外,正如其他人提到的,您不能使用 + 运算符进行时间计算。请改用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. 您确实应该修复触发器,因为它可能会导致其他问题。
  2. 小心光标。我一般认为它们是一场性能噩梦。对于像您这样的一次性更新,它们是可以接受的。

关于sql - 子查询返回超过 1 个值 : DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15340517/

相关文章:

sql - Foxpro:通过vfpoledb检查表是否存在

sql - 如果表为空,则将行插入表中,如果不在 SQLite 中,则替换现有行

Java sql更新数据库中的行

c# - 在 Fluent NHibernate 中自动截断字符串

c# - C#.Net 中的连接字符串

c# - 找到在某些特定的 asp.net 页面中使用的所有存储过程的简单方法是什么?

datetime - MQL4 中的日期时间算术

c# - 不是 DateTime 的日期时间格式的字符串

mysql - 通过 MySQL 函数反转字符串中的单词

datetime - FAGL_ACCOUNT_ITEMS_GL_API 不按 I_POSTING_DATES 范围返回任何数据