Using `min_active_rowversion` for global temporary tables
-
27-01-2021 - |
Question
I use global temporary tables for easy integration testing of my SQL Server backed application.
But the function min_active_rowversion
does not seem to include global temporary tables, like seen here:
using (var connection = new SqlConnection("data source=.;Integrated Security=True"))
{
connection.Open();
connection.Execute("create table ##mytable ( Id int, rv rowversion )");
var a = ToUInt64(connection.Query<byte[]>("select min_active_rowversion()").Single()); // => 20001
var x = ToUInt64(connection.Query<byte[]>("insert into ##mytable (Id) output Inserted.rv values (1)").Single()); // => 22647
var b = ToUInt64(connection.Query<byte[]>("select min_active_rowversion()").Single()); // => 20001
}
I can't see this limitation documented anywhere. Can this be made to work? And if so, how?
Solution
The explanation would appear to be that the global temporary table is in fact in TempDB, not the database your code is running against. This is because the MIN_ACTIVE_ROWVERSION() function is scoped to the database level.
The min_active_rowversion() function seems to work when you use the following code
USE [db]
CREATE table ##mytable ( Id int, rv rowversion )
USE [tempdb]
select min_active_rowversion()
insert into ##mytable (Id) values (1)
select min_active_rowversion()
insert into ##mytable (Id) values (1)
select min_active_rowversion()
Licensed under: CC-BY-SA with attribution
Not affiliated with dba.stackexchange