I SQL Server 2008 definitionen af sp_help
viser, at dette er hårdkodet for at returnere "ja", hvis kolonnen er nullbar og en af 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
I SQL Server 2000 er det defineret anderledes som
'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
Betydningen af stats
bits i syscolumns
i SQL Server 2000 er ikke fuldt dokumenteret, men jeg fandt et SQL Server 7.0 SP4 opgraderingsscript
der indstiller kolonneværdierne som følger (0x20
=32
i decimal)
+ 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
Jeg kunne ikke finde meget yderligere information, når jeg googlede efter hverken COL_FIXEDNULL
eller COL_NONSQLSUB
men fandt ud af, at lagringen af NULL
værdier for datatyper med fast længde ændret i SQL Server 7. I tidligere versioner blev nullbare datatyper med fast længde stille og roligt konverteret til variable i henhold til følgende tabel.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Dette diskuteres for SQL Server i KB 463166 (kun tilgængelig på fransk ) og ved at se på Sybase-dokumentationen ser det ud til, at det er er stadig tilfældet i det pågældende produkt .
Fra SQL Server 7.0 og fremefter en NULL
CHAR(100)
kolonne optog hele den erklærede faste kolonnelængde i rækkens dataafsnit med fast længde (indtil sparsomme kolonner blev indført i 2008 - hvilket ændrer adfærden igen).
Jeg formoder, at denne bit
i syscolumns.status
skelnet mellem de to forskellige lagerformater.