sql >> Databáze >  >> RDS >> Sqlserver

Co znamená FixedLenNullInSource v sp_help?

V SQL Server 2008 definice sp_help ukazuje, že toto je napevno zakódováno, aby vrátilo "yes", pokud sloupec má hodnotu null a jeden z 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 

V SQL Server 2000 je definován jinak jako

   '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

Význam stats bitů v syscolumns v SQL Server 2000 není plně zdokumentován, ale našel jsem skript upgradu SQL Server 7.0 SP4 který nastaví hodnoty sloupců následovně (0x20 =32 v desítkové soustavě)

+ 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

Při googlování pro COL_FIXEDNULL jsem nenašel mnoho dalších informací nebo COL_NONSQLSUB ale zjistil, že úložiště NULL hodnoty pro datové typy s pevnou délkou se v SQL Server 7 změnily. V předchozích verzích byly datové typy s pevnou délkou bez nuly převedeny na proměnné podle následující tabulky.

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

Toto je popsáno pro SQL Server v KB 463166 (k dispozici pouze ve francouzštině ) a z pohledu na dokumentaci Sybase se zdá, že je to v tomto produktu stále platí .

Od SQL Server 7.0 výše NULL CHAR(100) sloupec zabíral celou deklarovanou pevnou délku sloupce v datové části řádku s pevnou délkou (dokud nebyly v roce 2008 zavedeny řídké sloupce – což opět změnilo chování).

Předpokládám, že tento bit v syscolumns.status rozlišuje mezi dvěma různými formáty úložiště.




  1. Seskupit MySQL podle dat mezi

  2. Jak povolit aktualizaci výsledků pohledu v Oracle?

  3. Propojené servery Salesforce.com a sp_columns_ex

  4. PHP - sestavení víceúrovňového asociativního pole z databáze (třídění měst podle stavu z db)