1

ソース データベースの状態の厳密なマーカーとして、外部データベースの @@DBTS を sproc で取得したいと考えています。ええ、私は発行できると思います


USE ExternalDB
GO

SELECT @myVarbinary8 = @@DBTS
GO

USE OriginalDB
GO

しかし、たとえできたとしても、それは醜いようです。

今のところ、ソース データベースにスカラー値関数を埋め込んで、

SET @Result = SELECT @@DBTS

DBA に新しいユーザーに適切な権限を付与するように依頼するのを忘れるまで、これは問題なく機能し、プロセスがクラッシュしました。

似たようなもの

SELECT ExternalServer.dbo.@@DBTS

(私はそれがうまくいかないことを知っています)。



MSDN @@DBTS のドキュメントを参照してください  

@@DBTS (Transact-SQL)
現在のデータベースの現在のタイムスタンプ データ型の値を返します。
このタイムスタンプは、データベース内で一意であることが保証されています。
4

3 に答える 3

1

1つの方法は、そのスカラー関数をマスターデータベースに配置し、システムオブジェクトとしてマークすることです。そのようにして、現在のデータベースのコンテキストで呼び出されます。詳細については、こちらを参照してください: http ://weblogs.sqlteam.com/mladenp/archive/2007/01/18/58287.aspx

于 2008-11-05T20:08:36.570 に答える
1

「他の」データベースにストアド プロシージャを作成します。

CREATE PROCEDURE dbo.GetDatabaseTimestamp AS
   SET NOCOUNT ON;
   SELECT @@DBTS AS CurrentRowversion, MIN_ACTIVE_ROWVERSION() AS ActiveRowversion

そして、現在のデータベースから次のように呼び出すことができます。

EXECUTE ExternalDB.dbo.GetDatabaseTimestamp;
于 2008-11-06T10:21:21.777 に答える
0

情報をありがとう、Mladen、そのヒントは知っておくと良いです:)

しかし、これは master にある関数を現在のデータベース コンテキスト "ContextCurrent" から呼び出すのに役立ちますが、私が本当に必要としているのは、ソース データベース "ContextSource" のコンテキストからスカラー値関数を呼び出せるようにすることです。

一般的に、私は動的SQLに対して留保を持っていますが、ここでは次のように使用しました。


DECLARE @sourceDbName nvarchar(128)
SET     @sourceDbName = N'sbaportia1'

DECLARE @strQuery nvarchar(max)
DECLARE @parmDefn nvarchar(max)
DECLARE @DbtsCapture varbinary(8)
SET    @strQuery =
   '
          N' ' + N'USE' + N' ' + @sourceDbName + N' '
        + N' ' + N'SELECT @dbtsCapture = min_active_rowversion()'
   '

SET @parmDefn =
   N'
        @dbName varchar(128),
        @dbtsCapture varbinary(8) OUTPUT
   '

EXEC sp_executesql  @strQuery
                   ,@parmDefn
                   ,@dbName = 'autobahn'
                   ,@dbtsCapture = @dbtsCapture OUTPUT

SELECT @dbtsCapture

さらに、sp_executesql は別のスレッドで実行されるため、以下のスクリプト内のデータベース コンテキストは、sp_executesql の終了時と sp_executesql の開始時とで自動的に同じになります。(私は 2000 年代初頭に sp_executesql についてあまりにも多くのことを学びました。)

于 2008-11-06T01:27:00.560 に答える