sql-server - 在 sys.objects 中搜索对象我注意到我的表类型具有 name 列的前缀和后缀
问题描述
当我对数据库中的最近更改运行以下查询时,我注意到我的表类型带有前缀和后缀。
为什么表格类型会这样?
SELECT type, type_desc, name, create_date, modify_date
FROM sys.objects
ORDER BY create_date desc
解决方案
用户定义的表类型应该主要被认为是类型。这意味着在尝试查找有关它们的元数据时,您的起点应该是sys.types
(或者sys.table_types
,特别是),您将在其中找到没有前缀或后缀命名的对象。
此外,当想要探索一种表类型的模式时,应该使用type_table_object_id
fromsys.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
推荐阅读
- javascript - 为什么我使用数组映射方法创建的选项具有空值(React)?
- sql - 使用 SQL Server Express 通过电子邮件发送查询结果
- mysql - 如何解决'Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x96\xA4 t...' for column 'campaign_name' at row 1' in mysql?
- javascript - 具有动态最大高度的 CSS 动画元素
- html - 我如何使用 html 标签创建日历事件?
- reactjs - react-hook-form 只以多级形式注册最后一步的表单数据
- mongodb - mongodb突然要关闭监听套接字
- reactjs - 如何在反应中将图像动画到页面中心
- java - 在 Spring Hibernate 中处理超过 1000 条记录更新
- reactjs - UseState 使用旧值第二次更新了钩子