您不应该使用 systypes 或 syscolumns - 这些是向后兼容性视图,并且 sys.types 和 sys.columns 是高度首选,除非您尝试编写在 SQL Server 2000+ 上运行的代码(我也不推荐) 。
要获取有关您已经知道其名称的类型的信息:
SELECT name, precision, scale, max_length
FROM sys.types AS t
WHERE name = 'bVendor';
要获取数据库中所有用户定义类型的信息:
SELECT name, precision, scale, max_length
FROM sys.types AS t
WHERE is_user_defined = 1;
要获取有关特定表的所有类型(系统和用户定义)的信息:
UPDATE包括基本类型:
SELECT
[column] = c.name,
[base type] = COALESCE(bt.name, t.name),
[defined type] = t.name,
t.precision,
t.scale,
t.max_length
FROM sys.columns AS c
INNER JOIN sys.types AS t
ON c.system_type_id = t.system_type_id
AND c.user_type_id = t.user_type_id
LEFT OUTER JOIN sys.types AS bt
ON t.is_user_defined = 1
AND bt.is_user_defined = 0
AND t.system_type_id = bt.system_type_id
AND t.user_type_id <> bt.user_type_id
WHERE c.object_id = OBJECT_ID('dbo.your_table_name');
请注意,如果您使用别名类型(例如CREATE TYPE blat FROM nvarchar(32);
)。如果你真的必须使用那些(我也建议反对他们 https://sqlblog.org/2009/10/14/bad-habits-to-kick-using-alias-types),然后将连接子句更改为:
ON t.is_user_defined = 1
AND bt.is_user_defined = 0
AND t.system_type_id = bt.system_type_id
AND bt.user_type_id = bt.system_type_id