2017-10-18 5 views
0

j'ai couru sp_columns SomeTable sur une table sur mon ordinateur local, et a été confondu par la sortie d'une colonne qui devrait être une colonne varbinary(max):Pourquoi sp_columns affiche-t-il 'image' comme type_name d'un type varbinary (max)?

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

La partie déroutante est que cette colonne est une colonne varbinary (max) , mais le TYPE_NAME répertorié ici est image.

Donc, ma question est la suivante: pourquoi sp_columns l'indique-t-il comme image lorsqu'il s'agit d'un varbinary(max)?

C'est sur Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64)

+0

Depuis 'sp_columns' date de SQL Server 6.0 ([Ref] (https://msdn.microsoft.com/en-us/library/aa226174 % 28v = sql.70% 29.aspx? F = 255 & MSPPError = -2147217396).) Probablement transporte quelques bagages le long de Ye Good Olde Days. Plutôt que de modifier le résultat renvoyé et de casser le code existant, il continue simplement à renvoyer un type maintenant obsolète. Ils ont beaucoup d'autres façons de briser le code existant. – HABO

Répondre

0

j'ai pu reproduire ce. Je devine que IMAGE est défini comme

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

qui est le même que VARBINARY(MAX).

Changer MAX à toute autre valeur, il change d'image en VARBINARY

+0

Je suppose que cela a du sens. C'est juste bizzare puisque l'image est un type obsolète dans la dernière version de tsql. –

0

Je préfère toujours utiliser les vues de catalogue sys pour inspecter ce genre de choses au sujet de mes objets db - et ici, je reçois varbinary comme le type nom et -1 comme max_length (signifiant 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'