我有一个包含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的代码片段,最终帮助我弄清了这一点。
答案 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()
更新现有记录会有更多开销。