在sql server中sys_types中user_type_id和system_type_id之间的区别是什么

Jos*_*han 19 sql-server sqldatatypes

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

我想用sys.types内部连接sys.columns来获取用户表中列的数据类型,但这两个视图都有两个字段user_type_id和system_type_id,应该使用哪一个?

Hei*_*nzi 23

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

有两个JOIN 确实有意义.它们都适用于内置类型.

  1. sys.columns.user_type_id = sys.types.user_type_id

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

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

  2. sys.columns.system_type_id = sys.types.user_type_id

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

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


Cha*_*s M 7

从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都不对应.

换句话说,尝试使用user_type_id列连接system_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)
Run Code Online (Sandbox Code Playgroud)

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