sp_help中的FixedLenNullInSource是什么意思?

时间:2011-09-07 09:56:47

标签: sql-server sql-server-2005

看看FixedLenNullInSource是为了与SQL 2000兼容,但它实际意味着什么?

1 个答案:

答案 0 :(得分:7)

在SQL Server 2008中,sp_help的定义显示,如果列可以为空并且varbinaryvarcharbinary之一,则硬编码返回“是”, 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中statssyscolumns位的含义没有完整记录,但我发现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_FIXEDNULLCOL_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区分了两种不同的存储格式。