我有一个表DD,它是一个数据字典,带有字段(比如):
ColumnID (longint PK), ColumnName (varchar), Datatype (varchar)
我有另一张表V,其中我有以下形式的记录集:
ColumnID (longint FK), ColumnValue (varchar)
我希望能够将V中的记录集转换为另一个表Results,其中每个字段将根据DD.Datatype的值进行转换,以便目标表可能是(比如说):
ColumnID (longint FK), ColumnValue (datetime)
为了能够做到这一点,ISTM我需要能够做类似
的事情CONVERT(value of DD.Datatype, V.ColumnValue)
任何人都可以给我任何关于这是否可能的线索,如果是的话,语法是什么?我的google-fu证明不足以找到任何相关的内容
答案 0 :(得分:1)
你当然可以用动态sql做这样的事情。只要您知道数据类型是结果集中COLUMN的属性的限制,而不是结果集中的每个单元格。因此,给定列中的所有行必须具有相同的数据类型。
答案 1 :(得分:0)
在SQL中实现CONVERT(value of DD.Datatype, V.ColumnValue)
之类的东西的唯一方法是使用动态SQL。这有它自己的问题,例如基本上需要使用存储过程来保持查询的效率。
或者,您可以使用一个查询获取数据类型元数据,在应用程序中构造新查询,然后再次查询数据库。假设您使用的是SQL Server 2012+,您还可以尝试使用TRY_CAST()
或TRY_CONVERT()
,并编写如下查询:
SELECT TRY_CAST(value as VARCHAR(2)) FieldName
FROM table
WHERE datatype = 'VARCHAR' AND datalength = 2
但是,再一次,你必须知道有效类型是什么;没有动态SQL,您无法使用SQL动态确定。不允许将变量和参数用于对象或类型名称。但是,无论您做什么,都需要记住结果集的给定列中的所有数据必须具有相同的数据类型。
这样的大多数Entity-Attribute-Value tables通过接受数据类型由应用程序而不是RDBMS确定来牺牲强类型带来的数据完整性。 EAV不允许你拥有你的蛋糕(没有固定模式存储数据)并且也吃它(享受数据库强制执行强数据输入,不必在应用程序中对字符串进行类型转换等)。
EAV严重破坏了数据规范化。它打破了第一范式;最基本的规则,这只是其中一个后果。 EAV表将从笨拙到极难的任何地方查询数据,并且你几乎总是会牺牲性能,因为RDBMS是围绕关系模型构建的。
这并不意味着你不应该使用EAV表。它们对用户定义的字段相对较好。但是,它确实意味着他们总是很难查询和管理。这只是权衡。你打破了第一范式。查询和性能将受到这种选择的影响。
如果你真的想要存储所有这样的数据,那么你应该看看是将数据存储为XML还是JSON(SQL Server 2016) - 但是查询总是很麻烦 - 或使用像MongoDB或Cassandra这样的NoSQL数据存储而不是SQL RDBMS。