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
我的数据库性能技能不是很好 - 我找不到任何 '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