如何从对象ID和数据库ID确定SQL Server对象名?

时间:2010-05-29 13:10:43

标签: sql-server object sql-server-2000 metadata

我需要SQL Server 2005的行为,其中函数OBJECT_NAME接受两个参数obj iddb id,而SQL Server 2000只接受obj id,因此执行必须在上下文中被检查对象所属的数据库。

必须可以在函数中实现解决方案,因此可以在选择查询中使用它。

2 个答案:

答案 0 :(得分:5)

在SQL 2005及更高版本中,执行此操作当然是微不足道的。问题是SQL 2000.我曾经使用过2000次,但是不再能够访问它的任何安装;其余部分主要来自记忆,可能不准确。

关键是如何在编写代码时无法知道其他数据库(或多个数据库)的内容,从“当前”数据库以外的数据库中检索数据。 (是的,db_id参数非常方便!)对于这个问题和类似的问题,一般的解决方法是创建动态代码,如:

SET @Command = 'select name from ' + @dbname + '.dbo.sysobjects where object_id = ' + @ObjectId
EXECUTE (@Command)

问题是,我很确定你不能在函数内运行动态代码(或者只是在SQL 2000函数中运行)。

您可能不得不求助于创建临时表,通过动态查询填充它,然后在您尝试编写的“主”查询中使用它。 Psuedo代码就像:

CREATE #TempTable
IF SQL2000 or earlier
    INSERT #TempTable EXECUTE (select data from TargetDb.dbo.sysobjects)
    --  Note that the entire insert may need to be in the dynamic statement
ELSE
    INSERT #TempTable SELECT [from query based on object_id]

SELECT [the data you need]
 from YourTable
  join #TempTable

答案 1 :(得分:0)

在SQL 2008及更高版本中,使用:

OBJECT_NAME ( object_id [, database_id ] )  

例如:

SELECT TOP 10
    object_schema_name(objectid, dbid) as [SchemaName], 
    object_name(objectid, dbid) as [ObjectName],
    e.*
    from sys.dm_exec_cached_plans P
    CROSS APPLY sys.dm_exec_query_plan(P.plan_handle) E