TSQL:转换 data_type 并更新它的最快方法

TSQL: Fastest way to convert data_type and update it

我的数据库性能技能不是很好 - 我找不到任何 'good' Google 结果,所以我需要你的帮助。

我正在尝试转换 table 的所有列。 table 中的所有数据都是数据类型 varchar

我确实有一个参考 table,它有错误的数据但正确的元数据,如 Column_Name、Data_Type 等。==> 所以我尝试使用 table 与正确的元数据转换 table 与正确的数据。如以下示例所示,动态脚本想要转换实际上应为 datetime:

的列
IF @Datatype IN ('datetime')
Begin
    set @sqlDate = ('
    Update dbo.'+@Table+' 
    SET '+@Column+' = TRY_CONVERT( datetime, '+@Column+', 105)

    Alter Table dbo.'+@Table+'
    Alter Column '+@Column+' datetime;
    ')

    exec (@sqlDate);    

End

所以我的目标是像这样转换 Table :

+----------------+----------------+
| Col1 (varchar) | Col2 (varchar) |
+----------------+----------------+
| '01.01.2000'   | '124.5'        |
+----------------+----------------+

为此:

+-------------------------+--------------+
|     Col1(datetime)      | Col2 (float) |
+-------------------------+--------------+
| jjjj-mm-tt hh:mi:ss.mmm |        124.5 |
+-------------------------+--------------+

(基于正确的元数据 table)

您认为先将数据转换成#TempTable 并通过预转换的#TempTable 更新原始列更好吗?有更好的解决方案吗?

非常感谢!

这是我的做法。

首先,创建并填充示例 table(在以后的问题中保存这一步):

CREATE TABLE Sample
(
    DateTimeColumn varchar(50),
    FloatColumn varchar(50)
);

INSERT INTO Sample(DateTimeColumn, FloatColumn) VALUES ('01.01.2000', '124.5');

然后 - 更改 table 以添加具有正确数据类型的列。

ALTER TABLE Sample
    ADD AsDateTime DateTime,
        AsFloat float;

填充新列:

UPDATE Sample
SET AsDateTime =  TRY_CONVERT(datetime, DateTimeColumn, 105),
    AsFloat = TRY_CAST(FloatColumn AS float);

此时,您应该停下来检查一下您是否真的得到了正确的值。 验证新列数据后,您可以删除旧列

ALTER TABLE Sample
    DROP COLUMN DateTimeColumn;

ALTER TABLE Sample    
    DROP COLUMN FloatColumn;

并重命名新列:

EXEC sp_rename 'dbo.Sample.AsDateTime', 'DateTimeColumn', 'COLUMN';
EXEC sp_rename 'dbo.Sample.AsFloat', 'FloatColumn', 'COLUMN';

快速 select 验证更改:

SELECT DateTimeColumn, FloatColumn
FROM Sample;

结果:

DateTimeColumn          FloatColumn
2000-01-01 00:00:00     124.5