看看FixedLenNullInSource是为了与SQL 2000兼容,但它实际意味着什么?
答案 0 :(得分:7)
在SQL Server 2008中,sp_help
的定义显示,如果列可以为空并且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
SQL Server 2000中stats
中syscolumns
位的含义没有完整记录,但我发现SQL Server 7.0 SP4 upgrade script设置列值如下(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
进行Google搜索时,我找不到更多其他信息,但确实发现SQL Server 7中固定长度数据类型的NULL
值存储已更改。在以前的版本中,可空的固定长度数据类型按照下表静默转换为变量。
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
在SQL 463166(only available in French)中对SQL Server进行了讨论,并且从Sybase文档中看到它是still the case in that product。
从SQL Server 7.0开始,NULL
CHAR(100)
列占用了行的固定长度数据部分中的整个声明的固定列长度(直到2008年引入了稀疏列 - 这些更改再次表现。)
我认为bit
中的syscolumns.status
区分了两种不同的存储格式。