Database 可以在当前数据库以外的数据库上查询@@DBT吗?
对于源数据库状态的严格标记,我想捕获@DBTS 存储过程中的外部数据库。是的,我想我可以发布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 (我知道那不行)。 参见 @
使用外部数据库
开始
选择@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,上下文保证为原始上下文,不需要将其切换回原始上下文