I SQL Server 2008 definitionen av sp_help
visar att detta är hårdkodat för att returnera "ja" om kolumnen är nullbar och en av 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 definieras det annorlunda 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
Innebörden av stats
bitar i syscolumns
i SQL Server 2000 är inte helt dokumenterat men jag hittade ett SQL Server 7.0 SP4 uppgraderingsskript
som ställer in kolumnvärdena enligt följande (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
Jag kunde inte hitta mycket ytterligare information när jag googlade efter någon av COL_FIXEDNULL
eller COL_NONSQLSUB
men fick reda på att lagringen av NULL
värden för datatyper med fast längd ändrade i SQL Server 7. I tidigare versioner konverterades nullbara datatyper med fast längd tyst till variabel enligt följande tabell.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Detta diskuteras för SQL Server i KB 463166 (endast tillgängligt på franska ) och från att titta på Sybase-dokumentationen verkar det vara fortfarande fallet i den produkten .
Från SQL Server 7.0 och framåt en NULL
CHAR(100)
kolumnen tog upp hela den deklarerade fasta kolumnlängden i radens dataavsnitt med fast längd (tills glesa kolumner infördes 2008 - vilket ändrar beteendet igen).
Jag antar att denna bit
i syscolumns.status
skiljer mellan de två olika lagringsformaten.