sql >> Databasteknik >  >> RDS >> Sqlserver

Vad betyder FixedLenNullInSource i sp_help?

I SQL Server 2008 definitionen av sp_help visar att detta är hårdkodat för att returnera "ja" om kolumnen är nullbar och en av 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 definieras det annorlunda 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

Innebörden av stats bitar i syscolumns i SQL Server 2000 är inte helt dokumenterat men jag hittade ett SQL Server 7.0 SP4 uppgraderingsskript som ställer in kolumnvärdena enligt följande (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

Jag kunde inte hitta mycket ytterligare information när jag googlade efter någon av COL_FIXEDNULL eller COL_NONSQLSUB men fick reda på att lagringen av NULL värden för datatyper med fast längd ändrade i SQL Server 7. I tidigare versioner konverterades nullbara datatyper med fast längd tyst till variabel enligt följande tabell.

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

Detta diskuteras för SQL Server i KB 463166 (endast tillgängligt på franska ) och från att titta på Sybase-dokumentationen verkar det vara fortfarande fallet i den produkten .

Från SQL Server 7.0 och framåt en NULL CHAR(100) kolumnen tog upp hela den deklarerade fasta kolumnlängden i radens dataavsnitt med fast längd (tills glesa kolumner infördes 2008 - vilket ändrar beteendet igen).

Jag antar att denna bit i syscolumns.status skiljer mellan de två olika lagringsformaten.




  1. Hämta räkningsdata från Firebase som MySQL

  2. Distribuera Cloudera CDP Data Center på Oracle Cloud Infrastructure (OCI)

  3. Hur vet man vilken partition som kommer att användas i Postgres hashpartitionering?

  4. Hur man kör .sql-fil i Oracle SQL-utvecklarverktyg för att importera databas?