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 确实有意义.它们都适用于内置类型.
sys.columns.user_type_id = sys.types.user_type_id
对于内置类型,它返回内置类型.
对于用户定义的类型,它返回用户定义的类型.
sys.columns.system_type_id = sys.types.user_type_id
对于内置类型,它返回内置类型.
对于用户定义的类型,它返回内置的基本类型.这可能是有意义的,例如,如果要获取所有varchar列,包括基于varchar的所有用户定义列.
从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)
这将为所有列生成结果,包括具有分层和空间数据的列.
| 归档时间: |
|
| 查看次数: |
6161 次 |
| 最近记录: |