从系统MS SQL Server获取列信息

时间:2019-03-24 23:11:41

标签: sql sql-server tsql

当我使用以下SQL语句检索SQL Server数据库的列信息时。我得到的列多于实际数量,我猜这是因为那里也有系统列。

SELECT 
    c.name Field, 
    t.name Type,
    c.Precision, 
    c.Scale,
    c.max_length,
    c.is_nullable,
    c.collation_name 
FROM 
    sys.columns c 
INNER JOIN 
    sys.types t ON t.system_type_id = c.system_type_id
WHERE 
    object_id = OBJECT_ID('SOPOrders') 

您将看到上面的查询产生了十个Order Memos,而实际上它们仅是我仍然希望能够报告预置数据类型的maxchar和空值因素的var char之一,所以这是怎么回事请进行上述查询。

enter image description here

2 个答案:

答案 0 :(得分:2)

可能有两个原因。首先,您以错误的条件加入了types-您应该在两边都使用user_type_id而不是system_type_id。后者为您提供了底层的内置类型,该类型用作用户定义类型的基础。查看此查询,例如:

select * from sys.types t where t.user_type_id != t.system_type_id;

另一种可能的情况是该表具有稀疏的列集,但是我在这里可能是错误的。

当然,请确保您实际上在查询有关正确表的信息-始终包括模式名称限定符以及对象名称,例如:

WHERE object_id=object_id('dbo.SOPOrders')

不这样做将不会导致您观察到重复,但是这样做会为您节省大量时间,以找出在不同模式中具有相同名称的对象时间歇性不一致的原因。

答案 1 :(得分:1)

为什么不使用Information_Schema.COLUMNS呢?

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'SOPOrders'

或者尝试加入

ON c.user_type_id = t.user_type_id

代替

ON t.system_type_id=c.system_type_id