当我使用以下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之一,所以这是怎么回事请进行上述查询。
答案 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