2017-10-18 47 views
0

我在我的本地计算机上的表跑sp_columns SomeTable,并被输出为一列,应该是一个varbinary(max)列困惑:为什么sp_columns显示'image'作为varbinary(max)类型的type_name?

TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME PRECISION 
-------------------------------------------------------------------------------------- 
MDB    dbo   SomeTable  SomeColumn -4  image  2147483647 

混乱的部分是,这列是VARBINARY(max)列,但这里列出的TYPE_NAMEimage

所以我的问题是这样的:为什么sp_columns这是image当它是varbinary(max)

这是Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64)

+0

由于'sp_columns'追溯到到SQL Server 6.0([参考](https://msdn.microsoft.com/en-us/library/aa226174 %28v = sql.70%29.aspx?f = 255&MSPPError = -2147217396)。)它可能从Ye Good Olde Days那里带走一些行李。而不是改变返回的结果和打破现有的代码,它只是继续返回一个现在不赞成使用的类型。 _他们有很多其他方式来打破现有的代码。 – HABO

回答

0

我能重现此。我猜是因为IMAGE被定义为

Variable-length binary data from 0 through 2^31-1 

这是一样的VARBINARY(MAX)

更改MAX为任何其他值改变从图像VARBINARY

+0

我想这是有道理的。这只是bizzare,因为在tsql的最新版本中image是一个不推荐使用的类型。 –

0

我总是喜欢使用sys目录视图来检查这种事情对我的数据库对象 - 在这里,我得到varbinary作为类型名称和-1作为max_length(表示varbinary(max)):

SELECT 
    TableName = t.Name, 
    ColumnName = c.Name, 
    TypeName = ty.Name, 
    c.max_length 
FROM sys.tables t 
INNER JOIN sys.columns c ON c.object_id = t.object_id 
INNER JOIN sys.types ty ON ty.system_type_id = c.system_type_id 
WHERE t.name = 'SomeTable' 
    AND c.name = 'SomeColumn' 
相关问题