Trong SQL Server 2008, định nghĩa của sp_help
cho thấy điều này được mã hóa cứng để trả về "có" nếu cột là nullable và một trong 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
Trong SQL Server 2000, nó được định nghĩa theo cách khác là
'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
Ý nghĩa của stats
các bit trong syscolumns
trong SQL Server 2000 không được ghi lại đầy đủ nhưng tôi đã tìm thấy một tập lệnh nâng cấp SQL Server 7.0 SP4
đặt các giá trị cột như sau (0x20
=32
trong số thập phân)
+ 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
Tôi không thể tìm thấy nhiều thông tin bổ sung khi googling cho COL_FIXEDNULL
hoặc COL_NONSQLSUB
nhưng đã phát hiện ra rằng việc lưu trữ NULL
các giá trị cho các kiểu dữ liệu có độ dài cố định đã thay đổi trong SQL Server 7. Trong các phiên bản trước, các kiểu dữ liệu có độ dài cố định nullable đã được chuyển đổi âm thầm thành biến theo bảng sau.
+----------------------------+-----------+
| char | varchar |
| nchar | nvarchar |
| binary | varbinary |
| datetime | datetimn |
| float | floatn |
| int, smallint, and tinyint | intn |
| decimal | decimaln |
| numeric | numericn |
| money and smallmoney | moneyn |
+----------------------------+-----------+
Điều này được thảo luận cho Máy chủ SQL trong KB 463166 ( chỉ có sẵn bằng tiếng Pháp ) và khi xem tài liệu Sybase, có vẻ như vẫn là trường hợp trong sản phẩm đó .
Từ SQL Server 7.0 trở đi, NULL
CHAR(100)
cột chiếm toàn bộ chiều dài cột cố định đã khai báo trong phần dữ liệu độ dài cố định của hàng (cho đến khi các cột thưa thớt được giới thiệu vào năm 2008 - điều này lại thay đổi hành vi).
Tôi cho rằng bit
này trong syscolumns.status
phân biệt giữa hai định dạng lưu trữ khác nhau.