sql >> Base de Datos >  >> RDS >> Sqlserver

¿Qué significa FixedLenNullInSource en sp_help?

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.