Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O que significa FixedLenNullInSource em sp_help?


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.