En SQL Server 2008, la definición de sp_help
muestra que esto está codificado para devolver "sí" si la columna es anulable y una de 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
En SQL Server 2000 se define de manera diferente como
'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
El significado de las stats
bits en syscolumns
en SQL Server 2000 no está completamente documentado pero encontré un secuencia de comandos de actualización de SQL Server 7.0 SP4
que establece los valores de la columna de la siguiente manera (0x20
=32
en 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
No pude encontrar mucha información adicional al buscar en Google COL_FIXEDNULL
o COL_NONSQLSUB
pero descubrió que el almacenamiento de NULL
los valores para los tipos de datos de longitud fija cambiaron en SQL Server 7. En versiones anteriores, los tipos de datos de longitud fija anulables se convirtieron silenciosamente en variable según la siguiente tabla.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Esto se analiza para SQL Server en KB 463166 (solo disponible en francés ) y al mirar la documentación de Sybase parece que es sigue siendo el caso en ese producto .
Desde SQL Server 7.0 en adelante un NULL
CHAR(100)
la columna ocupó la totalidad de la longitud de columna fija declarada en la sección de datos de longitud fija de la fila (hasta que se introdujeron columnas dispersas en 2008, lo que cambió el comportamiento nuevamente).
Supongo que este bit
en syscolumns.status
diferenciado entre los dos formatos de almacenamiento diferentes.