如何获取表“sys.all_objects?”中对象的模式名称
当我知道架构是dbo时,使用OBJECT_SCHEMA_NAME函数返回“sys”...
select OBJECT_SCHEMA_NAME(o.schema_id),* from sys.all_objects o
我不想使用其他视图,但如有必要,我可以加入其他表格。
答案 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')