Database 可以在当前数据库以外的数据库上查询@@DBT吗?

Database 可以在当前数据库以外的数据库上查询@@DBT吗?,database,sql-server-2005,tsql,timestamp,Database,Sql Server 2005,Tsql,Timestamp,对于源数据库状态的严格标记,我想捕获@DBTS 存储过程中的外部数据库。是的,我想我可以发布 使用外部数据库 开始 选择@myVarbinary8=@@DBTS 开始 使用原始数据库 开始 但是,即使我可以,它看起来很丑陋 现在,我在源数据库中嵌入了一个标量值函数来调用 SET@Result=SELECT@@DBTS 在我忘记要求DBA为新用户授予适当的权限之前,它一直运行良好,这导致进程崩溃 类似于 选择ExternalServer.dbo。@@DBTS (我知道那不行)。 参见 @

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



使用外部数据库
开始

选择@myVarbinary8=@@DBTS
开始

使用原始数据库
开始
但是,即使我可以,它看起来很丑陋

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

SET@Result=SELECT@@DBTS

在我忘记要求DBA为新用户授予适当的权限之前,它一直运行良好,这导致进程崩溃

类似于

选择ExternalServer.dbo。@@DBTS


(我知道那不行)。

参见

@@DBTS(Transact-SQL)
返回当前数据库的当前时间戳数据类型的值。
此时间戳在数据库中保证是唯一的。
一种方法是将标量函数放在主数据库中,并将其标记为系统对象。这样就可以在当前数据库的上下文中调用它 有关更多信息,请参见此处:
谢谢你提供的信息,姆拉登,知道这个提示很好:)

虽然这有助于我从当前数据库上下文“ContextCurrent”调用驻留在master中的函数,但我真正想要的是能够从源数据库上下文“ContextSource”调用标量值函数

一般来说,我对动态sql有所保留,但我在这里使用它的方式如下



声明@sourceDbName nvarchar(128)
设置@sourceDbName=N'sbaportia1'

声明@strQuery nvarchar(最大值)
声明@parmDefn nvarchar(最大值)
声明@DbtsCapture varbinary(8)
设置@strQuery=

N'+N'使用'+N'+@sourceDbName+N''
+N''+N'SELECT@dbtsCapture=min\u active\u rowversion()


SET@parmDefn=
N'
@dbName varchar(128),
@dbtsCapture-varbinary(8)输出


EXEC sp_executesql@strQuery
,@parmDefn
,@dbName='autobahn'
,@dbtsCapture=@dbtsCapture输出

选择@dbtsCapture

此外,由于sp_executesql在单独的线程中运行, 下面脚本中的数据库上下文将是 在退出sp_executesql时自动保持相同 在输入sp_executesql时。
(我在2000年初对sp_executesql了解得太多了。)

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

CREATE PROCEDURE dbo.GetDatabaseTimestamp AS
   SET NOCOUNT ON;
   SELECT @@DBTS AS CurrentRowversion, MIN_ACTIVE_ROWVERSION() AS ActiveRowversion
然后从当前数据库中,您可以调用:

EXECUTE ExternalDB.dbo.GetDatabaseTimestamp;

只是一种风格/练习。。。我大脑的功能性编程方面喜欢远离不必要的副作用(改变数据库上下文和使用)。至少有w/sp_executesql,上下文保证为原始上下文,不需要将其切换回原始上下文