我需要SQL Server 2005的行为,其中函数OBJECT_NAME接受两个参数obj id
和db id
,而SQL Server 2000只接受obj id
,因此执行必须在上下文中被检查对象所属的数据库。
必须可以在函数中实现解决方案,因此可以在选择查询中使用它。
答案 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