我需要在sql中将值转换为不同的数据类型。据我所知,我可以使用任何CONVERT
,TRY_CONVERT
,PARSE
和TRY_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));
我需要澄清的是,在上述方法中,性能明智将某些值转换为不同数据类型的最佳方法是什么?
答案 0 :(得分:3)
让我们谈谈Convert,Cast和Parse以比较性能,因为其他人只是这些的变体。
CONVERT
是特定于SQL Server的,CAST
是ANSI。
CONVERT
更灵活,因为您可以格式化日期等。除此之外,它们几乎相同。如果您不关心扩展功能,请使用CAST。
PARSE
函数不是本机Sql函数,而是.NET Framework
公共语言运行时相关函数。然后显然它会产生性能开销,并且还需要在数据库服务器上存在.NET CLR。继续在任何可能的地方使用现有的CAST和CONVERT函数。
对于SQL Server:通常我会说 - CONVERT
是你的人。
如果您要转换特定数据类型,请参阅以下链接。示例还有TRY_PARSE
和TRY_CONVERT
。
答案 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