sql >> Database teknologi >  >> RDS >> Sqlserver

Hvad betyder FixedLenNullInSource i sp_help?

I SQL Server 2008 definitionen af ​​sp_help viser, at dette er hårdkodet for at returnere "ja", hvis kolonnen er nullbar og en af ​​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 
 

I SQL Server 2000 er det defineret anderledes som

   '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
 

Betydningen af ​​stats bits i syscolumns i SQL Server 2000 er ikke fuldt dokumenteret, men jeg fandt et SQL Server 7.0 SP4 opgraderingsscript der indstiller kolonneværdierne som følger (0x20 =32 i 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
 

Jeg kunne ikke finde meget yderligere information, når jeg googlede efter hverken COL_FIXEDNULL eller COL_NONSQLSUB men fandt ud af, at lagringen af ​​NULL værdier for datatyper med fast længde ændret i SQL Server 7. I tidligere versioner blev nullbare datatyper med fast længde stille og roligt konverteret til variable i henhold til følgende tabel.

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

Dette diskuteres for SQL Server i KB 463166 (kun tilgængelig på fransk ) og ved at se på Sybase-dokumentationen ser det ud til, at det er er stadig tilfældet i det pågældende produkt .

Fra SQL Server 7.0 og fremefter en NULL CHAR(100) kolonne optog hele den erklærede faste kolonnelængde i rækkens dataafsnit med fast længde (indtil sparsomme kolonner blev indført i 2008 - hvilket ændrer adfærden igen).

Jeg formoder, at denne bit i syscolumns.status skelnet mellem de to forskellige lagerformater.




  1. SQL Server BIT Datatype – Ultimativ guide

  2. PLS-00201:identifikator 'R_CUR' skal erklæres i dynamisk sql

  3. Postgresql - returner hele rækken som array

  4. Datagenerering og hardwarekvalitet