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



我有一个表,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)

谁能给我任何线索,说明这是否可能,如果是的话,语法是什么?事实证明,我的谷歌不足以找到任何相关内容

当然,你可以用动态SQL做这样的事情。 只要您知道数据类型是结果集中 COLUMN 的属性而不是结果集中每个单元格的限制。 因此,给定列中的所有行必须具有相同的数据类型。

在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动态地确定它。 不允许将变量和参数用于对象或类型名称。 但是,无论执行什么操作,都需要记住,结果集的给定列中的所有数据都必须具有相同的数据类型

大多数像这样的实体-属性-值表都牺牲了强类型带来的数据完整性,因为它接受了数据类型由应用程序而不是 RDBMS 确定。 EAV不允许你拥有你的蛋糕(存储没有固定模式的数据)并吃掉它(享受DB强制的强数据类型,不必在应用程序中键入字符串等)。

EAV非常严重地破坏了数据规范化。 它打破了第一范式;最基本的规则,这只是后果之一。 EAV表将使查询数据变得从笨拙到极其困难,并且您几乎总是会牺牲性能,因为RDBMS是围绕关系模型构建的。

这并不意味着您不应该使用 EAV 表。 它们对于用户定义的字段相对来说非常有用。 但是,这确实意味着他们总是很难查询和管理。 这只是权衡。 你打破了第一范式。 查询和性能将遭受该选择的后果。

如果你真的想像这样存储你的所有数据,你应该考虑将数据存储为XML或JSON(SQL Server 2016)的blob - 但这通常是查询的痛苦 - 或者使用NoSQL数据存储,如MongoDB或Cassandra而不是SQL RDBMS。

最新更新