Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was bedeutet FixedLenNullInSource in sp_help?

In SQL Server 2008 die Definition von sp_help zeigt, dass dies hartcodiert ist, um "yes" zurückzugeben, wenn die Spalte nullable und eine von varbinary ist , 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 

In SQL Server 2000 ist es anders als

definiert
   '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

Die Bedeutung der stats Bits in syscolumns in SQL Server 2000 ist nicht vollständig dokumentiert, aber ich habe ein Upgrade-Skript für SQL Server 7.0 SP4 gefunden die die Spaltenwerte wie folgt festlegt (0x20 =32 in Dezimalzahl)

+ 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

Beim Googeln nach COL_FIXEDNULL konnte ich nicht viele zusätzliche Informationen finden oder COL_NONSQLSUB habe aber herausgefunden, dass die Speicherung von NULL Werte für Datentypen mit fester Länge wurden in SQL Server 7 geändert. In früheren Versionen wurden Datentypen mit fester Länge, die Nullwerte zulassen, stillschweigend gemäß der folgenden Tabelle in Variablen konvertiert.

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

Dies wird für SQL Server in KB 463166 (nur auf Französisch verfügbar ) besprochen ) und wenn man sich die Sybase-Dokumentation ansieht, scheint das bei diesem Produkt immer noch der Fall .

Ab SQL Server 7.0 ein NULL CHAR(100) Spalte nahm die gesamte deklarierte feste Spaltenlänge im Datenabschnitt mit fester Länge der Zeile ein (bis 2008 Spalten mit geringer Dichte eingeführt wurden - die das Verhalten erneut ändern).

Ich nehme an, dass dieses bit in syscolumns.status zwischen den beiden unterschiedlichen Speicherformaten unterschieden.