В 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
разграничени между двата различни формата за съхранение.