用于存储 Int 浮点数和日期的用户定义数据类型
Posted
技术标签:
【中文标题】用于存储 Int 浮点数和日期的用户定义数据类型【英文标题】:User Defined Datatype to store Int float and date 【发布时间】:2015-09-16 12:53:29 【问题描述】:我有一个属性可以在某个时候取值 Integer、float、Date。是否可以使用用户定义的数据类型将相同的数据存储在单个列中,还是应该为相同的数据类型创建单独的表?
e.g.
<name,type,value>
<Id,int,12>
<Id2,float,12.02>
<Id3,datetime,'09-09-2015 00:00:01'>.
【问题讨论】:
只使用NVARCHAR(50)
数据类型
但是,如果它是这些有效类型中的任何一个,我就不会强加验证,我猜在取回浮点数时可能会丢失。
使用sql_variant
试图将不同类型的数据塞进一列通常会导致灾难——无论是现在的快速数据还是随着时间的推移而出现的数据。例如,它将完全破坏任何索引能力。列应包含相同“类型”的数据 - 不仅是数据类型,还有数据是是什么(即某人的姓名和电话号码可能都存储为字符串,但不是相同的“类型” ") - 那么是什么统一了这三件事并意味着它们应该存储在一个列中?
再看一遍——你在重新发明EAV吗?如果是这样,请注意,在大多数情况下,它被视为反模式。
【参考方案1】:
XML 允许您将任何元数据添加到您的值(实际上是转换为字符串)。一个快速而肮脏的例子(最好使用正确的 XML 命名空间):
select 'int' AS [value/@type],CAST(12 AS VARCHAR(MAX)) AS [value]
union select 'float' ,CAST(12.05 AS VARCHAR(MAX))
union select 'date' ,CAST(d'2015-05-01' AS VARCHAR(MAX))
union select 'datetime' ,CAST(GETDATE() AS VARCHAR(MAX))
for xml path(''),ROOT('root')
/*
Result
<root>
<value type="date">Mai 1 2015 12:00AM</value>
<value type="datetime">Sep 16 2015 3:04PM</value>
<value type="float">12.05</value>
<value type="int">12</value>
</root>
*/
【讨论】:
以上是关于用于存储 Int 浮点数和日期的用户定义数据类型的主要内容,如果未能解决你的问题,请参考以下文章