In SQL Server 2008 la definizione di sp_help
mostra che questo è codificato per restituire "yes" se la colonna è nullable e una di 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 è definito in modo diverso come
'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
Il significato delle stats
bit in syscolumns
in SQL Server 2000 non è completamente documentato, ma ho trovato uno script di aggiornamento di SQL Server 7.0 SP4
che imposta i valori della colonna come segue (0x20
=32
in decimale)
+ 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
Non sono riuscito a trovare molte informazioni aggiuntive durante la ricerca su Google di COL_FIXEDNULL
o COL_NONSQLSUB
ma ha scoperto che l'archiviazione di NULL
i valori per i tipi di dati a lunghezza fissa sono stati modificati in SQL Server 7. Nelle versioni precedenti i tipi di dati a lunghezza fissa nullable sono stati convertiti automaticamente in variabili come nella tabella seguente.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Questo è discusso per SQL Server in KB 463166 (disponibile solo in francese ) e dalla documentazione Sybase risulta che è questo prodotto è ancora valido .
Da SQL Server 7.0 in poi un NULL
CHAR(100)
colonna occupava l'intera lunghezza della colonna fissa dichiarata nella sezione dati a lunghezza fissa della riga (fino all'introduzione delle colonne sparse nel 2008, che modificano nuovamente il comportamento).
Presumo che questo bit
in syscolumns.status
differenziato tra i due diversi formati di archiviazione.