1

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


USE ExternalDB
GO

SELECT @myVarbinary8 = @@DBTS
GO

USE OriginalDB
GO

但是,即使我可以,它看起来也很丑。

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

设置@Result = 选择@@DBTS

在我忘记要求 DBA 为新用户授予适当的权限之前,它工作得很好,这导致了一个进程崩溃。

类似于

SELECT ExternalServer.dbo.@@DBTS

(我知道那行不通)。



请参阅   MSDN @@DBTS 文档

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

3 回答 3

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,很高兴知道这个提示:)

但是,虽然这有助于我从当前数据库上下文“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 了解得太多了。)

于 2008-11-06T01:27:00.560 回答