什么是在SQL中使用的最佳数据转换方法

时间:2015-08-07 06:32:00

标签: sql sql-server sql-server-2012

我需要在sql中将值转换为不同的数据类型。据我所知,我可以使用任何CONVERTTRY_CONVERTPARSETRY_PARSE内置函数。

SELECT 
    CONVERT(DECIMAL(18,2),'12');

SELECT 
    TRY_CONVERT(DECIMAL(18,2),'12');

SELECT 
    PARSE('12' AS DECIMAL(18,2));

SELECT 
    TRY_PARSE('12' AS DECIMAL(18,2));
SELECT 
    CAST('12' AS DECIMAL(18,2));

我需要澄清的是,在上述方法中,性能明智将某些值转换为不同数据类型的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

让我们谈谈Convert,Cast和Parse以比较性能,因为其他人只是这些的变体。

CONVERT是特定于SQL Server的,CAST是ANSI。

CONVERT更灵活,因为您可以格式化日期等。除此之外,它们几乎相同。如果您不关心扩展功能,请使用CAST。

PARSE函数不是本机Sql函数,而是.NET Framework公共语言运行时相关函数。然后显然它会产生性能开销,并且还需要在数据库服务器上存在.NET CLR。继续在任何可能的地方使用现有的CAST和CONVERT函数。

对于SQL Server:通常我会说 - CONVERT是你的人。

如果您要转换特定数据类型,请参阅以下链接。示例还有TRY_PARSETRY_CONVERT

参考:Performance comparison on large data set

答案 1 :(得分:2)

这只是一个基准测试;

declare @val DECIMAL(18,2);
declare @now datetime, @then datetime
DECLARE @intFlag INT

SET @intFlag = 1
select @then = getdate()
WHILE (@intFlag <=200000) begin
    set @val = CONVERT(DECIMAL(18,2),'12');
    SET @intFlag = @intFlag + 1
end
select @now = getdate()
print('CONVERT: ' + convert(varchar(50), datediff(millisecond, @then, @now)))

SET @intFlag = 1
select @then = getdate()
WHILE (@intFlag <=200000) begin
    Set @val = TRY_CONVERT(DECIMAL(18,2),'12');
    SET @intFlag = @intFlag + 1
end
select @now = getdate()
print('TRY_CONVERT: ' + convert(varchar(50), datediff(millisecond, @then, @now)))

--for other type of "conversion" also not including here....

以下是OutPut

CONVERT: 106
TRY_CONVERT: 110
PARSE: 4726
TRY_PARSE: 4736
CAST: 106