Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Que signifie FixedLenNullInSource dans sp_help ?

Dans SQL Server 2008, la définition de sp_help montre que ceci est codé en dur pour renvoyer "oui" si la colonne est nullable et l'un des 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 

Dans SQL Server 2000, il est défini différemment comme

   '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

La signification des stats bits dans syscolumns dans SQL Server 2000 n'est pas entièrement documenté mais j'ai trouvé un script de mise à niveau SQL Server 7.0 SP4 qui définit les valeurs de colonne comme suit (0x20 =32 en décimal)

+ 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

Je n'ai pas trouvé beaucoup d'informations supplémentaires lorsque j'ai cherché sur Google l'un ou l'autre de COL_FIXEDNULL ou COL_NONSQLSUB mais a découvert que le stockage de NULL les valeurs des types de données de longueur fixe ont changé dans SQL Server 7. Dans les versions précédentes, les types de données de longueur fixe nullables étaient silencieusement convertis en variable selon le tableau suivant.

+----------------------------+-----------+
| char                       | varchar   |
| nchar                      | nvarchar  |
| binary                     | varbinary |
| datetime                   | datetimn  |
| float                       | floatn     |
| int, smallint, and tinyint | intn      |
| decimal                    | decimaln  |
| numeric                    | numericn  |
| money and smallmoney       | moneyn    |
+----------------------------+-----------+

Ceci est discuté pour SQL Server dans KB 463166 (uniquement disponible en français ) et en consultant la documentation de Sybase, il semble que ce soit toujours le cas dans ce produit .

À partir de SQL Server 7.0, un NULL CHAR(100) La colonne occupait la totalité de la longueur de colonne fixe déclarée dans la section de données de longueur fixe de la ligne (jusqu'à ce que des colonnes éparses soient introduites en 2008 - ce qui modifie à nouveau le comportement).

Je suppose que ce bit dans syscolumns.status différencié entre les deux formats de stockage différents.