Время, введенное по умолчанию, будет одинаковым для всех строк, независимо от того, сколько времени потребуется для MERGE
.
Это не имеет ничего общего с атомарностью MERGE
.
CURRENT_TIMESTAMP
завершает вызов функции GETDATE()
. GETDATE()
- это постоянная времени выполнения . Каждая отдельная ссылка в плане гарантированно будет иметь одно и то же значение для всей продолжительности оператора (хотя, если у плана есть несколько ссылок на GETDATE()
, это будут две разные константы времени выполнения и могут оцениваться в разное время).
План выполнения здесь содержит только одну ссылку на функцию. Он рассчитывается один раз и получает метку выражения Expr1010
StmtText
|--Table Insert(OBJECT:(@alsoRows), SET:([JustAValue] = [tempdb].[dbo].[TestTable].[JustAValue] as [y].[JustAValue]))
|--Table Merge(OBJECT:([tempdb].[dbo].[TestTable] AS [y]), SET:([tempdb].[dbo].[TestTable].[JustAValue] as [y].[JustAValue] = @rows.[JustAValue] as [x].[JustAValue],[tempdb].[dbo].[TestTable].[Birth] as [y].[Birth] = [Expr1010]) ACTION:([Action1009]))
|--Compute Scalar(DEFINE:([Expr1010]=CONVERT_IMPLICIT(datetime2(7),getdate(),0)))
|--Table Spool
|--Filter(WHERE:([Action1009] IS NOT NULL))
|--Compute Scalar(DEFINE:([Action1009]=ForceOrder(CASE WHEN [TrgPrb1007] IS NOT NULL THEN NULL ELSE (4) END)))
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([x].[JustAValue]))
|--Table Scan(OBJECT:(@rows AS [x]))
|--Compute Scalar(DEFINE:([TrgPrb1007]=(1)))
|--Filter(WHERE:([tempdb].[dbo].[TestTable].[JustAValue] as [y].[JustAValue]=@rows.[JustAValue] as [x].[JustAValue]))
|--Table Scan(OBJECT:([tempdb].[dbo].[TestTable] AS [y]))
RAND()
также является константой времени выполнения, в которой легче увидеть это поведение на практике, поскольку оно не зависит от разработки долгосрочного оператора.
DECLARE @T TABLE(X FLOAT DEFAULT RAND());
MERGE INTO @T
USING sys.objects o ON o.object_id = X
WHEN NOT MATCHED THEN INSERT DEFAULT VALUES;
SELECT *
FROM @T; /*All rows will have the same value*/