2

1 つのテーブルで夏時間のために複数の行を調整しようとしています。エラーが発生する前に書き込まれたすべてのレコードに 1 時間を追加する必要があります。エラーが発生しています

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. カーソルには注意してください。私は一般的に、それらはパフォーマンスの悪夢です。ただし、あなたのような1回限りの更新の場合、それらは受け入れられます.
于 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、複数のレコードの更新を妨げている可能性のあるビューで使用されている可能性があるようです。

DateAdd ドキュメント

于 2013-03-11T14:03:16.077 に答える