如何获取表“sys.all_objects?”中对象的模式名称?

时间:2012-08-30 15:34:47

标签: sql-server

如何获取表“sys.all_objects?”中对象的模式名称

当我知道架构是dbo时,使用OBJECT_SCHEMA_NAME函数返回“sys”...

select OBJECT_SCHEMA_NAME(o.schema_id),* from sys.all_objects o

我不想使用其他视图,但如有必要,我可以加入其他表格。

4 个答案:

答案 0 :(得分:3)

使用" object_id"不是" schema_id"

select OBJECT_SCHEMA_NAME(o.object_id),* from sys.all_objects o

答案 1 :(得分:2)

您是在谈论sp_helptext等系统对象吗?您可以使用多种格式调用sp_helptext和其他系统对象,并为您翻译这些对象(主要是出于向后兼容性原因):

EXEC sp_helptext 'sp_helptext';
EXEC dbo.sp_helptext 'sp_helptext';
EXEC sys.sp_helptext 'sp_helptext';

SELECT * FROM sysobjects;
SELECT * FROM dbo.sysobjects;
SELECT * FROM sys.sysobjects;    

但该对象只能属于一个模式。在这种情况下,即使它也回答sys,它也是dbo

如果您的用户对象显示为sys,请告诉我们它们是什么。如果您只是想跟踪用户对象,可能会将dbo.foo命名为sys架构下 。如果您不想返回系统对象,我可能会建议sys.objects而不是sys.all_objects

编辑:

正如Ray指出的那样,你正在将schema_id传递给该函数。 The documentation shows您需要传递object_id,而不是schema_id。所以要么做以下其中一项:

SELECT OBJECT_SCHEMA_NAME(o.[object_id]),* FROM sys.all_objects o;

-- or

SELECT SCHEMA_NAME(o.[schema_id]),* FROM sys.all_objects o;

就个人而言,我更喜欢加入,例如:

SELECT s.name, o.* FROM sys.all_objects AS o;
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id];

为什么呢?因为这个查询可以跨数据库工作,而几个元数据函数将从其他数据库调用时返回NULL或 - 甚至更糟 - 错误的对象。

答案 2 :(得分:1)

试试这个:

select OBJECT_NAME(o.object_id),* from sys.all_objects o

您还可以选择列name

select o.name,* from sys.all_objects o

答案 3 :(得分:0)

这有效

从sys.all_objects中选择SCHEMA_NAME(o.schema_id),*

但是如果你想要我的自动脚本版本

插入@tt(字符串) 选择不同的' GRANT执行ON SCHEMA ::' + SCHEMA_NAME(oo.schema_id)+' TO role_execute_all_sp' 来自sys.all_objects oo SCHEMA_NAME(oo.schema_id)不在的地方(' INFORMATION_SCHEMA',' sys')