例:
USE AnotherDB -- This works - same ID as from other DB SELECT OBJECT_ID('AnotherDB.ASchema.ATable') -- This works SELECT OBJECT_NAME(OBJECT_ID('AnotherDB.ASchema.ATable')) USE ThisDB -- This works - same ID as from other DB SELECT OBJECT_ID('AnotherDB.ASchema.ATable') -- Gives NULL SELECT OBJECT_NAME(OBJECT_ID('AnotherDB.ASchema.ATable'))
显然,元数据功能期望当前的数据库. BOL条目通常具有类似于OBJECT_NAME等功能的语言.@H_403_5@
The Microsoft sql Server 2005 Database
Engine assumes that object_id is in
the context of the current database. A
query that references an object_id in
another database returns NULL or
incorrect results.@H_403_5@
我需要这样做的原因:@H_403_5@
>我无法从SP中使用其他数据库
>我不能在其他数据库或主(或除我自己以外的任何其他数据库)中创建代理UDF存根(或更改任何内容)以帮助我.@H_403_5@
那么当我在InDB中时如何从OBJECT_ID(‘AnotherDB.ASchema.ATable’)获取数据库?@H_403_5@
我的目标是从配置表中获取可能部分限定的名称,将其在当前上下文中解析为完全限定名称,使用PARSENAME获取数据库名称,然后使用动态sql构建脚本以便能够访问元数据表直接与database.sys.*或USE db; SYS.*@H_403_5@
解决方法
我正确理解您是否希望使用AnotherDB的db id?
SELECT * FROM master..sysdatabases WHERE name = 'AnotherDB'
否则,如果有帮助,您可以在动态sql中使用其他数据库:@H_403_5@
DECLARE @sql NVARCHAR(MAX),@objId INT SET @sql = N' USE AnotherDB SELECT @id = OBJECT_ID(''customer'') ' EXEC SP_EXECUTEsql @sql,N'@id INT OUTPUT',@id = @objId OUTPUT SELECT @objId
或者在其他dbs中执行SP:@H_403_5@
EXEC AnotherDB.dbo.ProcedureName @paramX = ...,@paramY = ...