如何更改SQL Server中的列数据类型并转换以前的类型而不会丢失数据

时间:2017-10-23 10:00:20

标签: sql sql-server

我有一个SQL Server数据库,我想更改列类型以减小它的大小:

  1. 我有一个名为Varchar(100)的字符串,并希望将其转换为Varchar(50)并且我必须将数据移至它(数据将适合varchar(50)

  2. 我有Varchar(30)表示时间作为纪元时间(例如 1508752574 )。我想将类型更改为Datetime并将数据从Varchar(30)转换为Datetime,然后将其放入Datetime

  3. 我可以在不丢失数据的情况下完成吗?

3 个答案:

答案 0 :(得分:0)

创建新列:

Alter table MyTable
add NewColumn1 varchar(50);

Alter table MyTable
add NewColumn2 datetime;

填写数据:

update MyTable
set NewColumn1 = left(Name,50),
    NewColumn2 = dateadd(s, epochcol1, '19700101');

然后,您可以删除旧列并重命名新列

答案 1 :(得分:0)

我没有看到任何数据丢失问题。

  

我有一个字符串名称Varchar(100),并希望将其转换为Varchar(50)并且我必须将数据移动到它(数据将适合varchar(50))

如果您的数据适合varchar(50)数据类型,则不会丢失数据,如果数据不适合插入将失败并且您可以纠正

此外,在使用below approach将您的纪元值转换为日期时间时,我没有发现任何数据丢失问题,因为您只需添加秒数

Select
    dateadd(S, [unixtime], '1970-01-01')
From [Table]

答案 2 :(得分:0)

第1点

ALTER TABLE dbo.table_name ALTER COLUMN name VARCHAR(50);

第2点 您需要添加另一个Datetime类型的列,并使用Datetime等效的epoch_time_col更新列。

ALTER TABLE dbo.table_name ADD epoch_time_dt DATETIME   NULL;
UPDATE dbo.table SET epoch_time_dt = DATEADD(SECOND, epoch_time_col, '19700101');

如果需要,您可以删除旧列

ALTER TABLE dbo.table_name DROP COLUMN epoch_time_col ;