在 sql server 中,sys.types 中的 user_type_id 和 system_type_id 有啥区别

Posted

技术标签:

【中文标题】在 sql server 中,sys.types 中的 user_type_id 和 system_type_id 有啥区别【英文标题】:in sql server what is the difference between user_type_id and system_type_id in sys.types在 sql server 中,sys.types 中的 user_type_id 和 system_type_id 有什么区别 【发布时间】:2013-12-19 08:31:10 【问题描述】:

sql server中sys.types视图中user_type_id和system_type_id有什么区别?

我想把sys.columns和sys.types内联,得到一个用户表中列的数据类型,但是这两个视图都有user_type_id和system_type_id两个字段,应该用哪一个?

【问题讨论】:

你看过documentation吗? 【参考方案1】:

你几乎不想加入sys.columns.system_type_id = sys.types.system_type_id。在用户定义类型的情况下,这将导致duplicate records。

有两个 JOIN 有意义。对于内置类型,它们都等效。

    sys.columns.user_type_id = sys.types.user_type_id

    对于内置类型,它返回内置类型。

    对于用户定义的类型,它返回用户定义的类型。

    sys.columns.system_type_id = sys.types.user_type_id

    对于内置类型,它返回内置类型。

    对于用户定义的类型,它返回内置基类型。这可能是有意义的,例如,如果您想获取所有 varchar 列,包括所有基于 varchar 的用户定义列。

【讨论】:

【参考方案2】:

来自 Heinzi 的回答(2014 年 5 月 5 日):

sys.columns.system_type_id = sys.types.user_type_id

对于内置类型,它返回内置类型。

对于用户定义的类型,它返回内置的基类型。这可能很有意义,例如,如果您想获取所有 varchar 列,包括所有 >基于 varchar 的用户定义的列。

我要补充一点,如果您要列出所有列及其数据类型,这个(第二个)解决方案将不是一个完整的解决方案。

自 SQL Server 2008 以来,空间和分层数据已被引入为(显然)内置的用户定义数据类型。这些从未与任何基本类型相关联。这意味着虽然他们有一个system_type_id(即240),但这个id并不对应任何user_type_id。

换句话说,将 system_type_id 列与 user_type_id 列连接的尝试将从查询结果中删除所有具有空间或分层数据类型的记录。

如果您只对内置的基本类型感兴趣,但还想查看包含空间和层次数据的列的结果,您可能需要使用以下修改后的连接:

select t.name, ...
from sys.columns c join sys.types t
on c.system_type_id = t.user_type_id
   or (c.system_type_id = 240 and c.user_type_id = t.user_type_id)

这将为所有列生成结果,包括具有分层和空间数据的列。

【讨论】:

以上是关于在 sql server 中,sys.types 中的 user_type_id 和 system_type_id 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server查询数据表主键及主键类型

onvif server Discovery实现

管道server-client

管道server-client

linux tcp server demo

Linux下 client server 连不上