对于源数据库状态的严格标记,我想捕获@@ DBTS sproc中的外部数据库。是的,我想我可以发出
USE ExternalDB
GO
SELECT @myVarbinary8 = @@DBTS
GO
USE OriginalDB
GO
但是,即使我可以,也似乎很难看。
现在,我在源数据库中嵌入了一个标量值函数来调用
SET @Result = SELECT @@ DBTS
工作正常,直到我忘记要求DBA为新用户授予适当的权利,这会使进程崩溃。
类似于
的东西SELECT ExternalServer.dbo.@@DBTS
(我知道这不起作用。)
@@ DBTS(Transact-SQL)
返回当前数据库的当前时间戳数据类型的值。
此时间戳保证在数据库中是唯一的。
答案 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。)