奇妙な何かが起こるSQL Serverのアップデートをキャッシュ値()
UPDATE LogChange
SET Created = GETDATE()
WHERE id > 6000
が.. :)
すべての行がCreated
列に同じ値を取得するSQL Server Management Studioで次のコマンドを実行しています。
SQL Serverにすべての行についてGetDate
を再計算させるにはどうすればよいですか?
奇妙な何かが起こるSQL Serverのアップデートをキャッシュ値()
UPDATE LogChange
SET Created = GETDATE()
WHERE id > 6000
が.. :)
すべての行がCreated
列に同じ値を取得するSQL Server Management Studioで次のコマンドを実行しています。
SQL Serverにすべての行についてGetDate
を再計算させるにはどうすればよいですか?
カーソルは、私が長年にわたって非常に便利以下「GETDATE()」パターンを発見した
declare @id int;
Declare toLoop cursor for
select Id from LogChange where id > 6000
OPEN toLoop
FETCH NEXT FROM toLoop INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
Update LogChange set Created = GETDATE() where id = @id
FETCH NEXT FROM toLoop INTO @id
END
close toLoop
DEALLOCATE toLoop
それを解決しました。特に、同じトランザクションで複数のテーブルを更新する場合。時間の値が正確に一致することは、私にとってはもっと有益でした。そして、個々の行のミリ秒までは正確です。
declare @dtNow datetime
SET @dtNow = GETDATE()
UPDATE LogChange
SET Created = @dtNow
WHERE id > 6000
私は、クエリの同じ句内の操作はすべてアットワンス評価されるため、単一のクエリでそれを行う方法があるとは思いません。
あなたは別の値が各行に適用されていることを保証にしたい場合は、間違いなくそのないクエリを記述します。
declare @dt datetime
set @dt = GETDATE()
;With Diffs as (
select
*,
ROW_NUMBER() OVER (ORDER BY id) * 10 as Offset
from
LogChange
WHERE id > 6000
)
UPDATE Diffs
SET Created = DATEADD(millisecond,Offset,@dt)
私たちは、上記のローごとに別々のオフセットを生成することを知って、そのこれらのオフセットを固定値に追加するのは間違いありません。 が表示されましたGETDATE()
はすべての行に対して同じ値を返しますが、私は@dt
という変数を導入していますので、一度だけ割り当てられていることを知っている理由はこれを保証する特定のドキュメントを見つけることができません。
idが6000より大きい場合、これは 'Created'カラムを現在のgetdate()値に設定します。何を期待していましたか? –
それは私が期待していたものです:)すべての4M行が同じ日付になるわけではありません:) – PEtter
あなたはどんな日を期待していましたか? –