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ě.