In SQL Server 2008 die Definition von sp_help
zeigt, dass dies hartcodiert ist, um "yes" zurückzugeben, wenn die Spalte nullable und eine von varbinary
ist , 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 ist es anders als
definiert '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
Die Bedeutung der stats
Bits in syscolumns
in SQL Server 2000 ist nicht vollständig dokumentiert, aber ich habe ein Upgrade-Skript für SQL Server 7.0 SP4
gefunden die die Spaltenwerte wie folgt festlegt (0x20
=32
in Dezimalzahl)
+ 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
Beim Googeln nach COL_FIXEDNULL
konnte ich nicht viele zusätzliche Informationen finden oder COL_NONSQLSUB
habe aber herausgefunden, dass die Speicherung von NULL
Werte für Datentypen mit fester Länge wurden in SQL Server 7 geändert. In früheren Versionen wurden Datentypen mit fester Länge, die Nullwerte zulassen, stillschweigend gemäß der folgenden Tabelle in Variablen konvertiert.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Dies wird für SQL Server in KB 463166 (nur auf Französisch verfügbar ) besprochen ) und wenn man sich die Sybase-Dokumentation ansieht, scheint das bei diesem Produkt immer noch der Fall .
Ab SQL Server 7.0 ein NULL
CHAR(100)
Spalte nahm die gesamte deklarierte feste Spaltenlänge im Datenabschnitt mit fester Länge der Zeile ein (bis 2008 Spalten mit geringer Dichte eingeführt wurden - die das Verhalten erneut ändern).
Ich nehme an, dass dieses bit
in syscolumns.status
zwischen den beiden unterschiedlichen Speicherformaten unterschieden.