web-dev-qa-db-ja.com

グローバル一時テーブルに「min_active_rowversion」を使用する

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
}

この制限はどこにも文書化されていません。これを機能させることはできますか?もしそうなら、どのように?

7
asgerhallas

説明は、グローバル一時テーブルは実際にはコードが実行されているデータベースではなく、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()

dbfiddle

9
George.Palacios