如果我接近这个错误,我对我的整体逻辑和设计的建议非常开放。我将首先解释问题和我的解决方案。
我必须收集几种类型的数据(varchar,money,real,bit),但每条记录可以收集0-1000 +的每种类型。例如,记录1可能有40个varchar字段和500个货币字段,需要存储。
所以我想我会制作4个表,每个数据类型一个,如下所示。理论记录1的数据如下所示:
-----------------------------------------------
|record(int)|fieldname(varchar)|value(varchar)|
|-----------|------------------|--------------|
|1 |field1 |test a |
|1 |field2 |test b |
-----------------------------------------------
(imagine 40 rows here total)
-----------------------------------------------
|record(int)|fieldname(varchar)|value(money) |
|-----------|------------------|--------------|
|1 |field3 |111 |
|1 |field4 |222 |
-----------------------------------------------
(imagine 500 rows here total)
-----------------------------------------------
|record(int)|fieldname(varchar)|value(real) |
|-----------|------------------|--------------|
(no real data to store for record 1)
-----------------------------------------------
|record(int)|fieldname(varchar)|value(bit) |
|-----------|------------------|--------------|
(no bit data to store for record 1)
我正在考虑制作一个包含4列varchar,money,real和bit的表。但是那时我只会使用每行4列中的1列而且它看起来不是最佳方式。
这是一个愚蠢的设计吗?现在是下一个问题:如何从正确的表中选择变量名而不必指定数据类型?除了做4个单独的查询,直到我得到结果。我在考虑使用3个工会,为每个工作台制作3个缺失的列。这是最好的方式吗?
答案 0 :(得分:1)
如评论中所述,对于行中的列,SQL Server不会为每个记录占用额外的存储空间,这些列对于可变长度字段为空。
每行对于允许空值的列都有一个空位图。如果排在 那列是null然后位图中的一位是1,否则它是0。
对于可变大小的数据类型,实际大小为0字节。
对于固定大小的数据类型,acctual大小是默认的数据类型大小 以字节为单位设置为默认值(0表示数字,''表示字符)。
进一步阅读:http://weblogs.sqlteam.com/mladenp/archive/2007/09/06/How_does_SQL_Server_really_store_NULL-s.aspx