是否可以在当前数据库以外的数据库上查询@@ DBTS?

时间:2008-11-05 19:49:08

标签: database sql-server-2005 tsql timestamp

对于源数据库状态的严格标记,我想捕获@@ DBTS sproc中的外部数据库。是的,我想我可以发出


USE ExternalDB
GO

SELECT @myVarbinary8 = @@DBTS
GO

USE OriginalDB
GO

但是,即使我可以,也似乎很难看。

现在,我在源数据库中嵌入了一个标量值函数来调用

SET @Result = SELECT @@ DBTS

工作正常,直到我忘记要求DBA为新用户授予适当的权利,这会使进程崩溃。

类似于

的东西
SELECT ExternalServer.dbo.@@DBTS

(我知道这不起作用。)



请参阅MSDN @@DBTS documentation

@@ DBTS(Transact-SQL)
返回当前数据库的当前时间戳数据类型的值。
此时间戳保证在数据库中是唯一的。

3 个答案:

答案 0 :(得分:1)

一种方法是将该标量函数放在master数据库中并将其标记为系统对象。这样就可以在当前数据库的上下文中调用它 看到这里获取更多信息: http://weblogs.sqlteam.com/mladenp/archive/2007/01/18/58287.aspx

答案 1 :(得分:1)

“其他”数据库中创建存储过程:

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

然后从您当前的数据库中,您可以致电:

EXECUTE ExternalDB.dbo.GetDatabaseTimestamp;

答案 2 :(得分:0)

感谢您提供的信息,Mladen,提示很清楚:)

虽然这有助于我在当前数据库上下文“ContextCurrent”中调用驻留在master中的函数,但我真正想要的是能够从源数据库“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过多了解waaayy。)