Performance TSQL:转换和更新数据类型的最快方法

Performance TSQL:转换和更新数据类型的最快方法,performance,tsql,database-performance,Performance,Tsql,Database Performance,我的数据库性能不是很好-我找不到任何“好”的谷歌结果,所以我需要你的帮助 我正在尝试转换表的所有列。此表中的所有数据都是数据类型varchar 我确实有一个引用表,它有错误的数据,但有正确的元数据,如列名称、数据类型等==>因此我尝试使用具有正确元数据的表来转换具有正确数据的表。如以下示例所示,动态脚本希望转换实际应为datetime的列: IF @Datatype IN ('datetime') Begin set @sqlDate = (' Update dbo.'+@Tab

我的数据库性能不是很好-我找不到任何“好”的谷歌结果,所以我需要你的帮助

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

我确实有一个引用表,它有错误的数据,但有正确的元数据,如列名称、数据类型等==>因此我尝试使用具有正确元数据的表来转换具有正确数据的表。如以下示例所示,动态脚本希望转换实际应为
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
因此,我的目标是转换如下表:

+----------------+----------------+
| Col1 (varchar) | Col2 (varchar) |
+----------------+----------------+
| '01.01.2000'   | '124.5'        |
+----------------+----------------+
为此:

+-------------------------+--------------+
|     Col1(datetime)      | Col2 (float) |
+-------------------------+--------------+
| jjjj-mm-tt hh:mi:ss.mmm |        124.5 |
+-------------------------+--------------+
(基于正确的元数据表)

您认为首先将数据转换为#tentable并通过预转换的#tentable更新原始列更好吗?有更好的解决办法吗


非常感谢

我会这样做的

首先,创建并填充样本表(请在以后的问题中保存此步骤):

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

ALTER TABLE Sample
    ADD AsDateTime DateTime,
        AsFloat float;
填充新列:

UPDATE Sample
SET AsDateTime =  TRY_CONVERT(datetime, DateTimeColumn, 105),
    AsFloat = TRY_CAST(FloatColumn AS float);
EXEC sp_rename 'dbo.Sample.AsDateTime', 'DateTimeColumn', 'COLUMN';
EXEC sp_rename 'dbo.Sample.AsFloat', 'FloatColumn', 'COLUMN';
此时,您应该暂停并检查是否确实获得了正确的值。 验证新列数据后,可以删除旧列

ALTER TABLE Sample
    DROP COLUMN DateTimeColumn;

ALTER TABLE Sample    
    DROP COLUMN FloatColumn;
并重命名新列:

UPDATE Sample
SET AsDateTime =  TRY_CONVERT(datetime, DateTimeColumn, 105),
    AsFloat = TRY_CAST(FloatColumn AS float);
EXEC sp_rename 'dbo.Sample.AsDateTime', 'DateTimeColumn', 'COLUMN';
EXEC sp_rename 'dbo.Sample.AsFloat', 'FloatColumn', 'COLUMN';
快速选择以验证更改:

SELECT DateTimeColumn, FloatColumn
FROM Sample;
结果:

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

我会这样做的

首先,创建并填充样本表(请在以后的问题中保存此步骤):

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

ALTER TABLE Sample
    ADD AsDateTime DateTime,
        AsFloat float;
填充新列:

UPDATE Sample
SET AsDateTime =  TRY_CONVERT(datetime, DateTimeColumn, 105),
    AsFloat = TRY_CAST(FloatColumn AS float);
EXEC sp_rename 'dbo.Sample.AsDateTime', 'DateTimeColumn', 'COLUMN';
EXEC sp_rename 'dbo.Sample.AsFloat', 'FloatColumn', 'COLUMN';
此时,您应该暂停并检查是否确实获得了正确的值。 验证新列数据后,可以删除旧列

ALTER TABLE Sample
    DROP COLUMN DateTimeColumn;

ALTER TABLE Sample    
    DROP COLUMN FloatColumn;
并重命名新列:

UPDATE Sample
SET AsDateTime =  TRY_CONVERT(datetime, DateTimeColumn, 105),
    AsFloat = TRY_CAST(FloatColumn AS float);
EXEC sp_rename 'dbo.Sample.AsDateTime', 'DateTimeColumn', 'COLUMN';
EXEC sp_rename 'dbo.Sample.AsFloat', 'FloatColumn', 'COLUMN';
快速选择以验证更改:

SELECT DateTimeColumn, FloatColumn
FROM Sample;
结果:

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

这看起来很容易注射。但看起来您正在尝试将
datetime
列转换为
datetime
;这完全没有意义。通过示例数据和预期结果,向我们展示您在这里真正想要做的事情。这段代码的意义是什么?除非列是
datetime
sql\u variant
,否则转换后的值将转换回原始类型。如果这是一个字符串,它将使用“本地”格式(不管是什么格式)再次成为一个字符串。另一方面,服务器必须再次转换值,更新15万行,然后更改列的类型将始终需要一段时间-服务器必须再次将所有这些字符串转换为datetime并验证它们。添加一个新的
datetime
列,将转换后的值存储在其中,重命名bot会更有意义h旧列和新列,最后删除旧列抱歉…我更新了我的帖子…希望你现在明白我的意思为什么你关心性能?不管怎样,这应该是一次性的-谁在乎它是否需要30分钟或5个小时?但是,我会同意Panagiotis Kanavos的建议-使用正确的数据类型向表中添加新列,po用
try\u convert
/
try\u cast
结果填充它们,删除旧列并重命名新列。这看起来很容易注入。但看起来您正试图将
datetime
列转换为
datetime
;这完全没有意义。用示例数据和预期结果向我们展示您的想法这段代码的意义是什么?除非列是
datetime
sql\u variant
,否则转换后的值将转换回原始类型。如果是字符串,它将使用“local”格式(无论是什么)再次变为字符串。另一方面,服务器必须再次转换值,更新15万行,然后更改列的类型将始终需要一段时间-服务器必须再次将所有这些字符串转换为datetime并验证它们。添加一个新的
datetime
列,将转换后的值存储在那里,重命名旧列和新列,最后删除旧列将更有意义对不起。。。我已经更新了我的帖子。。。希望你现在明白我的意思为什么你关心表现?不管怎么说,这应该是一次性的——谁在乎是30分钟还是5小时?不过,我还是同意Panagiotis Kanavos的建议——用正确的数据类型向表中添加新列,用
try\u convert
/
try\u cast
结果填充它们,删除旧列并重命名新列。乐于帮助:-)乐于帮助:-)