Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Какво означава FixedLenNullInSource в sp_help?

В SQL Server 2008 дефиницията на sp_help показва, че това е твърдо кодирано да връща „да“, ако колоната е nullable и едно от 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 

В SQL Server 2000 се дефинира по различен начин като

   '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

Значението на stats битове в syscolumns в SQL Server 2000 не е напълно документиран, но намерих скрипт за надграждане на SQL Server 7.0 SP4 който задава стойностите на колоната, както следва (0x20 =32 в десетичен знак)

+ 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

Не можах да намеря много допълнителна информация, когато търсих в гугъл за COL_FIXEDNULL или COL_NONSQLSUB но откри, че съхранението на NULL стойностите за типове данни с фиксирана дължина са променени в SQL Server 7. В предишни версии nullable типовете данни с фиксирана дължина бяха тихо преобразувани в променливи съгласно следната таблица.

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

Това се обсъжда за SQL Server в KB 463166 (достъпно само на френски ) и от разглеждане на документацията на Sybase изглежда, че това е все още е така в този продукт .

От SQL Server 7.0 нататък NULL CHAR(100) колоната зае цялата декларирана фиксирана дължина на колона в секцията с данни с фиксирана дължина на реда (до въвеждането на редки колони през 2008 г. - което отново промени поведението).

Предполагам, че този bit в syscolumns.status разграничени между двата различни формата за съхранение.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заменете единичните кавички в SQL Server

  2. Извличане на varbinary(MAX) от SQL Server до byte[] в C#

  3. Преобразувайте низове в ГЛАВНИ БУКВИ в SQL Server

  4. SQL Server - Как да заключите таблица, докато съхранената процедура приключи

  5. Как да генерирам произволно число за всеки ред в T-SQL избор?