W SQL Server 2008 definicja sp_help
pokazuje, że jest to zakodowane na sztywno, aby zwrócić "tak", jeśli kolumna ma wartość null i jedną z 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
W SQL Server 2000 jest inaczej definiowany jako
'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
Znaczenie stats
bity w syscolumns
w SQL Server 2000 nie jest w pełni udokumentowany, ale znalazłem skrypt aktualizacji SQL Server 7.0 SP4
który ustawia wartości kolumn w następujący sposób (0x20
=32
dziesiętnie)
+ 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
Nie mogłem znaleźć zbyt wielu dodatkowych informacji podczas wyszukiwania w Google opcji COL_FIXEDNULL
lub COL_NONSQLSUB
ale dowiedziałem się, że przechowywanie NULL
wartości dla typów danych o stałej długości zmienione w SQL Server 7. W poprzednich wersjach typy danych o stałej długości z wartościami null zostały po cichu przekonwertowane na zmienne zgodnie z poniższą tabelą.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Jest to omówione w przypadku SQL Server w KB 463166 (dostępne tylko w języku francuskim ) i z dokumentacji Sybase wynika, że jest to nadal w tym produkcie .
Od SQL Server 7.0 wzwyż NULL
CHAR(100)
kolumna zajęła całą zadeklarowaną stałą długość kolumny w sekcji danych o stałej długości wiersza (do czasu wprowadzenia rzadkich kolumn w 2008 r. - co ponownie zmienia zachowanie).
Zakładam, że ten bit
w syscolumns.status
rozróżnia się dwa różne formaty przechowywania.