No SQL Server 2008, a definição de
sp_help
mostra que isso é codificado para retornar "sim" se a coluna for anulável e uma de 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
No SQL Server 2000 é definido de forma diferente como
'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
O significado das
stats
bits em syscolumns
no SQL Server 2000 não está totalmente documentado, mas encontrei um script de atualização do SQL Server 7.0 SP4
que define os valores da coluna da seguinte forma (0x20
=32
em 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
Não consegui encontrar muitas informações adicionais ao pesquisar no Google para
COL_FIXEDNULL
ou COL_NONSQLSUB
mas descobri que o armazenamento de NULL
valores para tipos de dados de comprimento fixo alterados no SQL Server 7. Nas versões anteriores, os tipos de dados de comprimento fixo anuláveis eram convertidos silenciosamente em variável conforme a tabela a seguir. +----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Isso é discutido para o SQL Server no KB 463166 (disponível apenas em francês ) e olhando a documentação do Sybase parece que é ainda é o caso nesse produto .
Do SQL Server 7.0 em diante, um
NULL
CHAR(100)
column ocupou todo o comprimento de coluna fixo declarado na seção de dados de comprimento fixo da linha (até que colunas esparsas foram introduzidas em 2008 - o que muda o comportamento novamente). Presumo que este
bit
em syscolumns.status
diferenciado entre os dois formatos de armazenamento diferentes.