2016-06-24 6 views
0

奇妙な何かが起こるSQL Serverのアップデートをキャッシュ値()

UPDATE LogChange 
SET Created = GETDATE() 
WHERE id > 6000 

が.. :)

すべての行がCreated列に同じ値を取得するSQL Server Management Studioで次のコマンドを実行しています。

SQL Serverにすべての行についてGetDateを再計算させるにはどうすればよいですか?

+1

idが6000より大きい場合、これは 'Created'カラムを現在のgetdate()値に設定します。何を期待していましたか? –

+0

それは私が期待していたものです:)すべての4M行が同じ日付になるわけではありません:) – PEtter

+0

あなたはどんな日を期待していましたか? –

答えて

0

カーソルは、私が長年にわたって非常に便利以下「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 
+1

これが必要な理由はありますか?パフォーマンス面ではこれはあまり滑らかではありません。 – Jens

+0

Created colで一意の値を取得する。それは一度の仕事なので、時間がかかることは本当に問題ではありません。 – PEtter

+1

@ PEtter - ここでは一意の値は保証されていません。 2つ(またはそれ以上)の行に同じ値を割り当てることができるように、カーソルが決して速く実行されないと仮定しています。 'GETDATE()'は〜3msごとにしか値を変更しないので、それはすべての状況において確かには遠いです。 –

0

それを解決しました。特に、同じトランザクションで複数のテーブルを更新する場合。時間の値が正確に一致することは、私にとってはもっと有益でした。そして、個々の行のミリ秒までは正確です。

declare @dtNow datetime 

SET @dtNow = GETDATE() 

UPDATE LogChange 
SET Created = @dtNow 
WHERE id > 6000 
+0

実際には、 'GETDATE()'は 'DATETIME'を返します。したがって、正確に3になります。33ms :-)あなたが*ミリ秒の精度を必要とする場合は、 'DATETIME2(7)'データ型の値を返す 'SYSDATETIME()'を使用してください - 正確に100ns(yes - ** nano **秒です) –

+0

ありがとうございますmarc_s myここでの目標は、作成された列に一意の値を生成することでした。だからSYSDATETIME()は私を助けてくれました:) – PEtter

+0

これは、OPが求めているものの反対です。 – Paparazzi

0

私は、クエリの同じ句内の操作はすべてアットワンス評価されるため、単一のクエリでそれを行う方法があるとは思いません。

0

あなたは別の値が各行に適用されていることを保証にしたい場合は、間違いなくそのないクエリを記述します。

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という変数を導入していますので、一度だけ割り当てられていることを知っている理由はこれを保証する特定のドキュメントを見つけることができません。