SQL Serverを使用したアプリケーションの統合テストを簡単にするために、グローバル一時テーブルを使用しています。
しかし、関数min_active_rowversion
には、次のようにグローバル一時テーブルが含まれていないようです。
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
}
この制限はどこにも文書化されていません。これを機能させることはできますか?もしそうなら、どのように?
説明は、グローバル一時テーブルは実際にはコードが実行されているデータベースではなく、TempDBにあるということです。これは、 MIN_ACTIVE_ROWVERSION() 関数のスコープがデータベースレベルであるためです。
次のコードを使用すると、min_active_rowversion()関数が機能するようです
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()