首页 > 解决方案 > 在 sys.objects 中搜索对象我注意到我的表类型具有 name 列的前缀和后缀

问题描述

当我对数据库中的最近更改运行以下查询时,我注意到我的表类型带有前缀和后缀。

为什么表格类型会这样?

SELECT type, type_desc, name, create_date, modify_date
FROM sys.objects
ORDER BY create_date desc

在此处输入图像描述

标签: sql-serverssms

解决方案


用户定义的表类型应该主要被认为是类型。这意味着在尝试查找有关它们的元数据时,您的起点应该是sys.types(或者sys.table_types,特别是),您将在其中找到没有前缀或后缀命名的对象。

此外,当想要探索一种表类型的模式时,应该使用type_table_object_idfromsys.table_types来找到合适的sys.object,而不是试图通过名称来定位它们。

sys.objects中,我们可以注意到两件重要的事情——这些对象实际上是sys模式的一部分,并被标记为is_ms_shipped。具体来说,这些对象被认为是系统对象。它们都存在于sys模式中,但需要唯一的名称,这表明需要后缀的原因之一。它们还与其他系统对象共享sys模式,这表明需要前缀的原因。

所以我想说TT_前缀是为了避免与模式中的其他对象类型发生命名冲突sys,而_47DBAE45后缀是为了避免多个表类型之间的冲突,其中类型本身具有相同的名称但存在于不同的模式中。


创建了两种Students表类型,一种 in dbo(如问题所示)和一种 in Xyz,我运行以下查询:

select SCHEMA_NAME(tt.schema_id), tt.name,
       SCHEMA_NAME(so.schema_id),so.name,
      so.is_ms_shipped
from sys.table_types tt
inner join sys.objects so
    on tt.type_table_object_id = so.object_id

显示此结果:

              name                  name                    is_ms_shipped
------------- ----------- --------- ----------------------- -------------
dbo           Students    sys       TT_Students_01142BA1    1
Xyz           Students    sys       TT_Students_02FC7413    1

推荐阅读