SQL Server 2008では、sp_helpの定義 列がnull許容で、varbinaryのいずれかである場合、これが「yes」を返すようにハードコードされていることを示しています 、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 Server7.0SP4アップグレードスクリプト
が見つかりました。 これにより、列の値が次のように設定されます(0x20 =32 10進数)
+ 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で変更された固定長データ型の値。以前のバージョンでは、null許容の固定長データ型は次の表のようにサイレントに変数に変換されていました。
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
これについては、SQLServerのKB463166(フランス語でのみ利用可能 )で説明されています。 )およびSybaseのドキュメントを見ると、その製品の場合も 。
SQL Server 7.0以降、NULL CHAR(100) 列は、行の固定長データセクションで宣言された固定列の長さ全体を占めていました(2008年にスパース列が導入されるまで、動作が再び変更されます)。
このbitだと思います syscolumns.status内 2つの異なるストレージ形式を区別しました。