T-SQL中的Cast与Convert的区别

379

什么情况下应该使用 CAST 而不是 CONVERT?选择其中一个是否会有性能问题?哪个更接近ANSI-SQL标准?

7个回答

392

CONVERT是SQL Server特有的,而CAST是ANSI标准。

CONVERT更加灵活,可以格式化日期等。除此之外,它们基本上是相同的。如果您不关心扩展功能,请使用CAST

编辑:

如@beruic和@C-F在下面的评论中所指出的,隐式转换(即不使用CAST或CONVERT)可能会导致精度损失。有关更多信息,请参见CAST and CONVERT,尤其是这张图表:SQL Server Data Type Conversion Chart。具有这些额外信息后,原始建议仍然保持不变。尽可能使用CAST。


5
我认为有一些数字转换需要使用CAST来保留精度,但是我很难找到可靠的信息来源。 - beruic
2
@beruic 你说得对,MSDN上有相关信息:http://msdn.microsoft.com/zh-cn/library/ms187928.aspx CAST在DECIMAL和NUMERIC类型之间转换时需要保留精度。 - C-F
6
@beruic 这是关于文章底部的图片http://i.msdn.microsoft.com/dynimg/IC170617.gif。现在我认为精度损失可能会发生在隐式转换时,而在使用CAST或CONVERT时不会发生。这还不太清楚... - C-F
2
@C-F 我同意这一点并且确实需要更具体的文档说明,因此让我们期望微软能够做到这一点。但是你发现得很不错 :) - beruic
1
请记住,CONVERT是100%微软专有的SQL扩展,因此在99%的关系型数据库中,您将更难重用查询和过程。在SQL中转换数据类型的标准函数是CAST。 - alejandrob
显示剩余2条评论

31

19

两者在执行计划中完全相同,都显示为CONVERT(tinyint,...,0),所以你的测试可能有问题。https://dbfiddle.uk/psHeIX_X - undefined

17

CAST 是标准的 SQL 语法,但 CONVERT 是 T-SQL 方言专用的。在 datetime 类型的情况下,convert 有一定的优势。

使用 CAST,你需要指定表达式和目标类型;而使用 CONVERT,还需要提供第三个参数来表示转换的样式,并且该样式仅适用于特定的转换,例如字符字符串和日期时间值之间的转换。例如,CONVERT(DATE, '1/2/2012', 101) 将按照样式 101 将字面字符转换为 DATE 类型,该样式代表美国标准。


11

似乎没有人注意到的是可读性。有….

CONVERT(SomeType,
    SomeReallyLongExpression
    + ThatMayEvenSpan
    + MultipleLines
    )

可能比…更容易理解。

CAST(SomeReallyLongExpression
    + ThatMayEvenSpan
    + MultipleLines
    AS SomeType
    )

9
我认为CAST通常更易读。即使对于较长的表达式,CAST(Column1 AS int)CONVERT(int, Column1)更容易理解。 - S.Serpooshan
鉴于CAST是标准,我经常看到CAST,因此对我来说它已成为更易读的版本。 - Bilbottom

6

CAST使用ANSI标准。在可移植性方面,这将适用于其他平台。CONVERT是特定于SQL Server的。但它是非常强大的函数。您可以为日期指定不同的样式。


4

您也不应该使用CAST来获取哈希算法的文本。 CAST(HASHBYTES('...') AS VARCHAR(32))CONVERT(VARCHAR(32), HASHBYTES('...'), 2)不同。如果没有最后一个参数,结果将是相同的,但不是可读文本。据我所知,您无法在CAST中指定该参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接