【问题标题】:Change column type without losing data更改列类型而不丢失数据
【发布时间】:2012-06-14 05:17:20
【问题描述】:

我正在处理一个 SQL 数据库,我有一个名为“价格”的列。创建数据库时,“价格”列设置为NVARCHAR 我需要将其类型更改为decimal(18, 2),而不会丢失数据库中的数据。这应该由 SQL 脚本完成

我想创建一个新列,将数据移动到其中,删除旧列,然后重命名新创建的列。

有人可以帮我举个例子来说明如何做到这一点吗? SQL中还有一个函数可以将字符串解析为十进制吗?

谢谢

【问题讨论】:

  • 你有没有研究过如何做到这一点?你有什么,你被困在哪里?

标签: sql database sql-server-2008 column-types


【解决方案1】:

新列不需要添加两次,更新新列后删除旧列即可:

ALTER TABLE table_name ADD new_column_name decimal(18,2)

update table_name
set new_column_name = convert(decimal(18,2), old_column_name)

ALTER TABLE table_name DROP COLUMN old_column_name

请注意,如果old_column_name 不是数字,convert 可能会失败。

【讨论】:

  • 缺少将 new_column_name 重命名为 old_column_name 的步骤,仍然 +1
  • convert() 函数出现“语法错误:意外的'十进制(十进制)'”
  • 当然希望 mysql 为你做了这个:/ 看起来工作很忙。感谢您的回答!
【解决方案2】:

您可以使用 Management Studio 直观地进行这些更改。然后,使用“生成更改脚本”按钮来获取您所做更改的脚本。请务必在原始 ddbb 的副本中进行所有测试,以防出现问题。

【讨论】:

【解决方案3】:

类似的东西

Alter Table [MyTable] Add Column NewPrice decimal(18,2) null

Then

Update [MyTable] Set NewPrice = Convert(decimal(18,2),[Price]) Where Price is not null

如果上述方法失败了,那么你需要加强它以处理有趣的事情

一旦您满意,请使用 Alter Table 删除旧列并将新列重命名为 sp_rename

【讨论】:

    【解决方案4】:

    如果你只想改变列的数据类型,你可以这样做=>

    Alter Table YourTableName
    Alter Column ColumnName DataType 
    

    我已经在 SQL Server 2012 及其工作上对此进行了测试。

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 2019-04-26
      • 2011-07-25
      • 2017-12-07
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多