SQL Server ->> 内置标量函数TRY_PARSE、TRY_CAST和TRY_CONVERT的各自特点和区别
SQL Server到了目前的2014版本有三个函数是用来转换数据格式的。虽说之前版本中已经有CAST和CONVERT这两个函数来干这个事情。问题是,一旦往目标数据类型转换失败就会造成报错。
TRY_PARSE、TRY_CAST和TRY_CONVERT的共同特点:
1)即便转换失败也不会造成整个语句报错,只会在无法转换的情况下输出NULL值;
TRY_PARSE:
TRY_PARSE是用于将字符串类型的数据转换成时间或者数值类型的数据。它是一个基于.NET CLR Runtime的标量函数。语法是TRY_PARSE(<string/string column> AS <data_type> [USING <culture>])
下面做一个字符串转时间的实验:
SQL Server 版本:
Microsoft SQL Server 2014
Enterprise Edition (64-bit) on Windows NT 6.3 <X64>
SELECT TRY_PARSE('' AS DATETIME), TRY_CAST('' AS DATETIME), TRY_CONVERT(DATETIME,'')
SELECT TRY_PARSE('2015/09/01' AS DATETIME), TRY_CAST('2015/09/01' AS DATETIME), TRY_CONVERT(DATETIME,'2015/09/01')
SELECT TRY_PARSE('2015/09/01 14:14:45' AS DATETIME), TRY_CAST('2015/09/01 14:14:45' AS DATETIME), TRY_CONVERT(DATETIME,'2015/09/01 14:14:45')
SELECT TRY_PARSE('2015/09/01 14:14:45' AS DATETIME), TRY_CAST('2015/09/01 14:14:45' AS DATETIME), TRY_CONVERT(DATETIME,'2015/09/01 14:14:45')
SELECT TRY_PARSE('2015/09/01 14:14:45+0001' AS DATETIME), TRY_CAST('2015/09/01 14:14:45+0001' AS DATETIME), TRY_CONVERT(DATETIME,'2015/09/01 14:14:45+0001')
上面代码输出的结果如下图所示
可以看到TRY_PARSE在将纯数字转为DATETIME的情况下居然失效,这点让我非常意外,而且我尝试了DATE类型也是一样的结果。
而如果加了像"-"或者"/"这样的时间分隔符则三个函数都能转换成功。
还有一点让我惊讶的是TRY_CAST和TRY_CONVERT不支持带有时区的转换,而TRY_PARSE则可以。
而当我把第四行代码的冒号修改成中文下面的冒号时则SQL Server辨认不出来。

TRY_CAST和TRY_CONVERT:
这一对更多是CAST和CONVERT这对函数的变体,语法上一样,只是当无法成功转换的时候是报错或者输出NULL值。
三者的区别总结如下:
1)TRY_PARSE只支持字符转数值或者时间类型,而TRY_CAST和TRY_CONVERT支持更多的类型;
2)三者有一点比较好的就是对于字符的空格处理,只要空格在处在分割符号的前后像“2015/ 09/ 10”这样是可以被成功处理的,但是如果空格隔开本身就是一个整体的数据值部分,则全部不能识别,像“2015/0 9/10”。
2)TRY_PARSE由于是CLR写的函数,对于源数据的数据格式支持比较广或者要求比较宽松,而TRY_CAST和TRY_CONVERT则要求比较严格。这点从上面的例子中,TRY_PARSE支持带有时区的时间格式而其他两个不支持就可以看出。而TRY_PARSE的支持范围远不止于此。
下面这个例子就证明了TRY_PARSE是仅最大的努力和可能去转换数据,而后两者则需要很严格数据格式
SELECT TRY_PARSE('Thursday, 19 Nov 2015' AS DATETIME)
SELECT TRY_CONVERT(DATETIME, 'Thursday, 19 Nov 2015');

-------------------------------------- update 2015/12/09 ----------------------------------------------
TRY_PARSE和TRY_CAST在把字符转换成数值这一功能上,TRY_PARSE在某种情况下要比TRY_CAST差。这里做个实验。
SELECT Column1,
TRY_CAST(Column1 AS FLOAT) AS TRY_CAST,
TRY_CAST(REPLACE(Column1,',','') AS FLOAT) AS TRY_CAST_REMOVE_COMMA,
TRY_PARSE(Column1 AS FLOAT) AS TRY_PARSE,
TRY_PARSE(REPLACE(Column1,',','') AS FLOAT) AS TRY_PARSE_REMOVE_COMMA
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0'
,'Excel 12.0 Xml;HDR=YES;IMEX=1;Database=D:\1.xlsx'
,'SELECT * FROM [sheet1$]');
上面语句的结果

我的源文件内容是这样的:
| Column1 |
| 123,456 |
| 123456.789 |
| 123456 |
| 2,464 |
| 210,860 |
| ABC |
可以看到结果中对于第5行的转换TRY_PARSE没能把数字前后类似于空格的特殊字符忽略。这点上TRY_CAST应该说做得更加好。
SQL Server ->> 内置标量函数TRY_PARSE、TRY_CAST和TRY_CONVERT的各自特点和区别的更多相关文章
- SQL Server 内置函数、临时对象、流程控制
SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...
- 10、SQL Server 内置函数、临时对象、流程控制
SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...
- sql server 内置ETL工具学习(一) BCP篇
sql server 内置ETL工具学习 常用的导入方式:bcp, BULK INSERT,OPENROWSET和 SSIS. BCP BCP全称BULK COPY PROGRAM 有以下特点: 命令 ...
- sql server内置存储过程、查看系统信息
1.检索关键字:sql server内置存储过程,sql server查看系统信息 2.查看磁盘空间:EXEC master.dbo.xp_fixeddrives , --查看各个数据库所在磁盘情况S ...
- SQL Server内置的HTAP技术
SQL Server内置的HTAP技术 目录 背景 SQL Server在OLAP上的发展 SQL Server的初代HTAP SQL Server逐渐增强的HTAP SQL Server列存总结 H ...
- Oracle SQL常用内置系统函数总结
Oracle数据库 内置系统函数主要分为以下类别:数学函数.字符串函数.日期函数.转换函数.聚合函数.分析聚合函数 一.数学函数 ------------返回数字 abs(n):返回数字 ...
- sql server内置函数
MSDN标准文档:https://msdn.microsoft.com/zh-cn/library/ff848784(v=sql.120).aspx 配置函数 select @@servername ...
- 总结Sql Server内置函数实现MD5加密
--MD5加密 --HashBytes ('加密方式', '待加密的值') --加密方式= MD2 | MD4 | MD5 | SHA | SHA1 --返回值类型:varbinary(maximum ...
- mysql 内置函数和sql server 内置函数的区别
以下函数均没有对参数做说明,使用的使用需要了解其参数内容 数据库 sql server mysql oracle 举例 获得当前系统时间 getdate() now() sysdate 注意不是函数 ...
随机推荐
- asp.net WebService技术简介
1.什么是web service? 这里借助百度百科专业的解释:web service是一个平台独立的.低耦合的.自包含的.基于可编程的web应用程序(说简单点,就是使用web service继续不需 ...
- jmeter调试脚本之变量参数化
前言 对于参数化,觉得用得最多的应该是csvread函数.csv data config以及用户自定义变量(前一篇文章已经进行了讲解)控制器这几个 案例:bugfree ,提交bug,参数bug名称和 ...
- 【Css】一个简单的图片库
今天做一个简单的图片库! 其实这个在w3school教程里介绍得很好了,不过看到什么,自己动手做一次,记得也深刻不是. 我们分几步来走: 第一步:先写一个坯子. <html> <he ...
- css3中比较少用到的属性记录
letter-spacing 属性 支持:所有浏览器都支持 letter-spacing 属性. letter-spacing 属性增加或减少字符间的空白(字符间距). 该属性定义了在文本字符框之间插 ...
- cg教程
Unity对shader的重点支持是cg语言,因为具有跨平台性质 Cg语言和CPU 上的C语言是很相似的,只不过有了自己的一套关键字和函数库 Cg语言的权威和入门教程在NVID1A的官方网站上,如果以 ...
- twitter storm常用命令
1.提交Topologies命令格式:storm jar [jar路径] [拓扑包名.拓扑类名][stormIP地址][storm端口][拓扑名称][参数]eg:storm jar /home/sto ...
- spring的基本用法
1,关于spring容器: spring容器是Spring的核心,该 容器负责管理spring中的java组件, ApplicationContext ctx = new ClassPathXmlAp ...
- 深入理解JavaScript系列(结局篇)
介绍 最近几个月忙得实在是不可开交,终于把<深入理解JavaScript系列>的最后两篇“补全”了,所谓的全是不准确的,因为很多内容都没有写呢,比如高性能.Ajax安全.DOM详解.Jav ...
- 网站部署中遇到的问题-未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
问题描述: 运行站点抛出错误:未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项 原因: 应用程序池没有启用32位程序. 解决方法: 找到站点对应的应用程序池,设置启用32 ...
- 01.MD5加密
namespace _01.MD5加密 { class Program { static void Main(string[] args) { //MD5加密就是给想要的密码或者其它字符加密 //如果 ...