在SQL Server中是否可以根据另一个字段的内容转换字段的类型?

时间:2017-05-19 13:45:37

标签: sql-server type-conversion

我有一个表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证明不足以找到任何相关的内容

2 个答案:

答案 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。