Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2012:DATETIME-Diskrepanzen zwischen Einfügungen und Triggern

Aufgrund der deklarativen Natur von SQL kann die Datenbank-Engine möglicherweise Nehmen Sie sich die Freiheit, Teile einer SQL-Anweisung in beliebiger Reihenfolge auszuwerten (solange dies die Semantik nicht beeinflusst). Ihr Vorschlag, dass GETUTCDATE() zwischengespeichert werden könnte, ist plausibel.

Ich weiß, das beantwortet deine Frage nicht. Aber was auch immer die Implementierung von GETUTCDATE in SQL2012 ist, es könnte sich durchaus in einer zukünftigen Version ändern. Vermeiden Sie es also, sich darauf zu verlassen, oder zukünftige Upgrades könnten zu einem echten Problem werden. Implementieren Sie Ihre Logik auf eine Weise, die sich nicht auf Annahmen bezüglich der Auswertungsreihenfolge stützt.

In Ihrem speziellen Fall sehe ich einige mögliche Lösungen.

  1. Wenn Sie kein Problem mit OwningStatuses haben etwas später Zeit haben als UserStatusesHistory , dann hilft es vielleicht schon, wenn Sie den dritten Schritt als separaten Batch an SQL Server schicken.
  2. Schritte 2 und 3 vertauschen; und lassen Sie den Trigger OwningStatuses abfragen anstatt sich ein eigenes Datum auszudenken.
  3. Verwenden Sie keine Trigger mehr; Es gibt mehr als einen Grund, dies in Betracht zu ziehen.