【发布时间】:2019-01-21 18:54:21
【问题描述】:
我有一个包含 10M+ 行的表,并且想要将其中一列的数据类型从 nvarchar(254) 更改为 decimal(7,2)。进行此更改的最有效和最有效的查询是什么?
我曾尝试使用 ALTER 进行此更改,但在 SSMS 中出现错误
将数据类型 nvarchar 转换为数值时出错。
我也尝试过使用 CAST,但这也会导致错误。诚然,我不是 DBA,所以我很难理解以下内容:
如何正确编写不会产生错误的 CAST 查询
CAST 和 CONVERT 函数是否改变了数据库级别的数据设计(意思是在对象资源管理器中,当我右键单击表然后单击“设计”时,我会看到列的数据类型已更改)或者更改仅持续到下一个查询运行或程序退出。
这个表最初是在一个多月前创建的,是几个月前运行的工作流的结果;此后,此工作流程已计划以每小时的节奏将新数据推送到表中,因此删除作业/表并重新开始不是一种选择。
SET STATISTICS TIME ON
ALTER TABLE Clone3
ALTER COLUMN Price decimal(7,2)
最终目标是正确存储此数据,以便在将其摄取到其他可视化程序(例如 Tableau、Power BI 等)时执行算术运算。也就是说,这里的预期结果是针对数据类型改成Decimal(7,2),但实际结果是nvarchar(254)。
更新
运行SELECT Price from Clone3 WHERE TRY_CONVERT(decimal(7,2),Price) IS NULL后,有 239 条记录以科学计数法返回。例如-5.0000000000000003E-2
最终更新
我运行以下查询来更新导致转换错误的记录(这些是负数,例如“-0.05”,由于某种奇怪的原因被转换为科学记数法)。
UPDATE Clone3
SET Price = CAST(Price AS Float)
WHERE TRY_CONVERT(decimal(7,2), Price) IS NULL
因为现在所有记录都是数字数据类型,所以我可以使用此查询将整个数据集转换为小数 (7,2)。
ALTER TABLE Clone3
ALTER COLUMN Price decimal(7,2)
我想我可以称之为解决了,非常感谢大家的回复,特别是 @Larnu 提供的代码 sn-p 最终帮助我解决了这个问题。
【问题讨论】:
-
如果您收到有关转换的错误,您首先需要找到有问题的值。你能分享(部分)来自
SELECT Price from Clone3 WHERE TRY_CONVERT(decimal(7,2),Price) IS NULL;的结果吗?谢谢。 -
另外,我刚刚注意到了,但是你说的“数据类型要更改为
Decimal(7,2),但实际结果是nvarchar(254)”是什么意思?如果您希望返回的结果为varchar,则存储varchar。不过老实说,这句话听起来像是XY Problem。 -
@Larnu - 我在写这篇文章时尝试遵循提供的指导方针,并认为我误读了一些东西。我的场景中的“实际结果”是我目前看到的。重申我上面写的内容,“......这里的预期结果是将数据类型更改为 Decimal(7,2),但我目前看到的是 nvarchar(254)。”如有任何混淆,我们深表歉意。
-
@Larnu - 以下是您要求我运行的查询的一些结果:` -7.0000000000000007E-2 -5.0000000000000003E-2 -5.0000000000000003E-2 5.999999999999998E9999999999999999。 2.9999999999999999E-2 -5.0000000000000003E-2 2.9999999999999999E-2 -4.0000000000000001E-2 4.0000000000000001E-2`
-
评论不是此类信息的地方。请编辑您的帖子。
标签: sql sql-server casting type-conversion alteryx