Sql server 如何根据对象id和数据库id确定SQL Server对象名称?

Sql server 如何根据对象id和数据库id确定SQL Server对象名称?,sql-server,object,sql-server-2000,metadata,Sql Server,Object,Sql Server 2000,Metadata,我需要SQL Server 2005的行为,其中函数OBJECT_NAME接受两个参数,obj id和db id,而SQL Server 2000只接受obj id,因此执行必须在检查对象所属的数据库的上下文中进行 解决方案必须能够在函数中实现,以便可以在选择查询中使用。在SQL 2005及以上版本中,这样做当然很简单。问题是SQL2000。我在2000年以前用了很多,但现在已经不能使用它的任何装置;其余部分主要来自记忆,可能不准确 关键是当您无法知道编写代码时其他数据库(或多个数据库)将是什么

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


解决方案必须能够在函数中实现,以便可以在选择查询中使用。

在SQL 2005及以上版本中,这样做当然很简单。问题是SQL2000。我在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

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

对象名称(对象id[,数据库id])
例如:

选择前10名
对象\模式\名称(objectid,dbid)为[SchemaName],
对象名称(objectid,dbid)为[ObjectName],
e*
从sys.dm_exec_cached_plan P
交叉应用sys.dm\u exec\u query\u plan(P.plan\u handle)E

如果您对当前数据库上下文(即“已使用”)不作任何假设,并且如果您没有对象id和数据库id,则无法识别该对象。是否都将提供给函数调用?是的,对象id和数据库id将提供给函数。是。不能使用动态SQL。您会得到错误“只有函数和扩展存储过程才能从函数中执行。”我不得不愚蠢地提到,我曾经读过一篇文章,其中有一位伟大的大脑在函数中嵌入了对xp_cmdshell的调用。想象一下,每行进行一次剥离,查询一个网站,并将数据返回到您的查询中。求求你,求求你不要那样做!菲利普,你描述了我问这些问题的原因。我已经准备好了,可能没有一个简单的解决方案。我需要它来与sp_lock结果集一起使用,因此预先创建临时表(游标通过系统中的所有数据库并将所有来自sysobjects的数据池)的方法可能有点昂贵,特别是在经常调用时,但肯定还有一些路要走。谢谢你的回答。