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