Dans SQL Server 2008, la définition de sp_help
montre que ceci est codé en dur pour renvoyer "oui" si la colonne est nullable et l'un des varbinary
, varchar
, binary
, char
'FixedLenNullInSource' =
CASE
WHEN Type_name(system_type_id) NOT IN ( 'varbinary', 'varchar',
'binary', 'char' ) THEN '(n/a)'
WHEN is_nullable = 0 THEN @no
ELSE @yes
END
Dans SQL Server 2000, il est défini différemment comme
'FixedLenNullInSource' = case
when type_name(xtype) not in ('varbinary','varchar','binary','char')
Then '(n/a)'
When status & 0x20 = 0 Then @no
Else @yes END
/* ... */
from syscolumns
La signification des stats
bits dans syscolumns
dans SQL Server 2000 n'est pas entièrement documenté mais j'ai trouvé un script de mise à niveau SQL Server 7.0 SP4
qui définit les valeurs de colonne comme suit (0x20
=32
en décimal)
+ CASE WHEN (type_name(xtype) IN ('text', 'image')
AND (colstat & 0x2000)!=0)
OR (type_name(xtype) IN ('binary', 'char', 'timestamp')
AND (typestat&1)=0 )
THEN 32 ELSE 0 END -- COL_FIXEDNULL, COL_NONSQLSUB
Je n'ai pas trouvé beaucoup d'informations supplémentaires lorsque j'ai cherché sur Google l'un ou l'autre de COL_FIXEDNULL
ou COL_NONSQLSUB
mais a découvert que le stockage de NULL
les valeurs des types de données de longueur fixe ont changé dans SQL Server 7. Dans les versions précédentes, les types de données de longueur fixe nullables étaient silencieusement convertis en variable selon le tableau suivant.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Ceci est discuté pour SQL Server dans KB 463166 (uniquement disponible en français ) et en consultant la documentation de Sybase, il semble que ce soit toujours le cas dans ce produit .
À partir de SQL Server 7.0, un NULL
CHAR(100)
La colonne occupait la totalité de la longueur de colonne fixe déclarée dans la section de données de longueur fixe de la ligne (jusqu'à ce que des colonnes éparses soient introduites en 2008 - ce qui modifie à nouveau le comportement).
Je suppose que ce bit
dans syscolumns.status
différencié entre les deux formats de stockage différents.