如何获取表“sys.all_objects”中对象的模式名称?
当我知道架构是 dbo 时,使用 OBJECT_SCHEMA_NAME 函数会返回“sys”...
select OBJECT_SCHEMA_NAME(o.schema_id),* from sys.all_objects o
我不想使用其他视图,但如有必要,我可以加入其他表。
如何获取表“sys.all_objects”中对象的模式名称?
当我知道架构是 dbo 时,使用 OBJECT_SCHEMA_NAME 函数会返回“sys”...
select OBJECT_SCHEMA_NAME(o.schema_id),* from sys.all_objects o
我不想使用其他视图,但如有必要,我可以加入其他表。
使用“object_id”而不是“schema_id”
select OBJECT_SCHEMA_NAME(o.object_id),* from sys.all_objects o
您是在谈论系统对象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
编辑:
正如雷指出的那样,您正在传递schema_id
给函数。文档显示您需要通过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 或更糟的是返回错误的对象。
试试这个:
select OBJECT_NAME(o.object_id),* from sys.all_objects o
您还可以选择列name
:
select o.name,* from sys.all_objects o
这有效
选择 SCHEMA_NAME(o.schema_id),* from sys.all_objects o
但如果你想要我的自动脚本版本
插入@tt(字符串)选择不同的'GRANT execute ON SCHEMA :: '+SCHEMA_NAME(oo.schema_id)+' TO role_execute_all_sp' from sys.all_objects oo where SCHEMA_NAME(oo.schema_id) not in ('INFORMATION_SCHEMA','sys ')