如何将nvarchar(254)转换为十进制(7,2)

时间:2019-01-21 18:54:22

标签: sql sql-server casting type-conversion alteryx

我有一个包含10M +行的表,并且想要将一列的数据类型从nvarchar(254)更改为decimal(7,2)。进行此更改的最有效的查询是什么?

我尝试使用ALTER进行更改,但在SSMS中出现错误

  

将数据类型nvarchar转换为数字时出错。

我也尝试过使用CAST,但这也会导致错误。诚然,我不是DBA,所以我一直难以理解以下内容:

  1. 如何正确编写不会产生错误的CAST查询

  2. 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的代码片段,最终帮助我弄清了这一点。

2 个答案:

答案 0 :(得分:3)

android:hardwareAccelerated="true"不能直接转换为十进制(7,2),尽管可以将其转换为5.9999999999999998E-2,然后可以转换为十进制(7,2)。 EG

float

虽然不是最有效的方法或通用的解决方案,但是您可以两次更改表,例如:

select cast(cast('5.9999999999999998E-2' as float) as decimal(7,2))

答案 1 :(得分:0)

最有效的方法可能是清空表并重新加载它:

capabilities = { 'chromeOptions':  { 'useAutomationExtension': False}}

driver = webdriver.Chrome(desired_capabilities = capabilities)
driver.get("https://www.moodys.com")

driver.find_element_by_css_selector(".nav-bottom-item-container.login-item").click()

更新现有记录会有更多开销。