0 votes

serveur sql avec une mise à jour et 2 champs datetime et getdate()

L'exigence est que les deux champs doivent être égaux, que feriez-vous ?

declare @var datetime

set @var = getdate()

update table set f1=@var,f2=@var

ou simplement

update table set f1=getdate(),f2=getdate()

5voto

dcp Points 26928

Définitivement la première façon, parce que 2 appels à getdate() retourneront très probablement des valeurs différentes.

2voto

Martin Smith Points 174101

Réponse originale : getdate() semble être comme rand() et n'est évalué qu'une seule fois dans une requête. Cette requête a pris plus d'une minute pour être retournée et toutes les données de la getdate() sont les mêmes.

select getdate()
from sys.objects s1, sys.objects s2, sys.objects s3

Mise à jour de Mais quand j'ai regardé le plan de requête pour une mise à jour de 2 colonnes différentes, j'ai pu voir que l'opérateur scalaire de calcul appelait getdate() deux fois.

J'ai testé de faire une mise à jour avec rand()

CREATE TABLE #t(
    [f1] [float] NULL,
    [f2] [float] NULL,
)
insert into #t values (1,1)
insert into #t values (2,2)
insert into #t values (3,3)

update #t set f1=rand(),f2=rand()
select * from #t

Qui donne

f1                     f2
---------------------- ----------------------
0.54168308978257       0.574235819564939
0.54168308978257       0.574235819564939
0.54168308978257       0.574235819564939

0voto

Raj More Points 22358

En fait, cela dépend de la version de SQL.

GetDate() était une fonction déterministe avant SQL 2005 . La réponse renvoyée était la même valeur pour toute la durée de la déclaration.

En SQL 2005 (et au-delà) Getdate() est non déterministe, ce qui signifie que chaque fois que vous l'appelez, vous obtenez une valeur différente.

Comme les deux fonctions GetDate() seront évaluées avant le début de la mise à jour, l'OMI les renverra avec la même valeur.

Sans connaître la taille de votre table et de vos partitions et la charge de votre serveur, je choisirais l'option 1.

0voto

AllenG Points 6242

Je vais opter pour quelque chose d'autre que les performances : la lisibilité / la communication de l'intention.

Dans cette optique, l'option 1 est probablement meilleure. Vous dites, en effet, aux futurs développeurs "Je fixe explicitement f1 y f2 à la même DateTime". Si les exigences changent à l'avenir et que (pour une raison ou une autre) f1 y f2 doivent être mises à jour à des moments différents (ou si quelque chose change et qu'elles sont évaluées à des moments différents), vous avez toujours la même date pour les deux.

Dans l'option deux, tout ce que vous dites est que f1 y f2 doivent être mis à jour avec l'heure actuelle à chaque fois que leurs opérations de mise à jour sont exécutées. Encore une fois, si quelque chose change dans vos exigences et qu'ils doivent être évalués dans des déclarations séparées pour une raison quelconque, ils ne seront plus nécessairement la même valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X