In SQL Server 2008 is de definitie van sp_help
laat zien dat dit hard gecodeerd is om "ja" te retourneren als de kolom nullable is en een van 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
In SQL Server 2000 is het anders gedefinieerd als
'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
De betekenis van de stats
bits in syscolumns
in SQL Server 2000 is niet volledig gedocumenteerd, maar ik vond een SQL Server 7.0 SP4 upgradescript
die de kolomwaarden als volgt instelt (0x20
=32
in decimalen)
+ 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
Ik kon niet veel aanvullende informatie vinden toen ik googlede naar COL_FIXEDNULL
of COL_NONSQLSUB
maar ontdekte dat de opslag van NULL
waarden voor datatypes met een vaste lengte zijn gewijzigd in SQL Server 7. In eerdere versies werden nullable datatypes met een vaste lengte stil geconverteerd naar variabel volgens de volgende tabel.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Dit wordt besproken voor SQL Server in KB 463166 (alleen beschikbaar in het Frans ) en uit de Sybase-documentatie blijkt dat dit nog steeds het geval in dat product .
Vanaf SQL Server 7.0 en verder een NULL
CHAR(100)
kolom nam het geheel van de gedeclareerde vaste kolomlengte in het datagedeelte van de rij met vaste lengte in beslag (totdat in 2008 schaarse kolommen werden geïntroduceerd - die het gedrag weer veranderen).
Ik neem aan dat deze bit
in syscolumns.status
onderscheid gemaakt tussen de twee verschillende opslagformaten.