技术开发 频道

内置新函数亮剑SQL Server 2012

        【IT168 专稿】SQL Server 2012新引入了三个内置的转换功能:PARSE,TRY_ PARSE和 TRY_CONVERT。用户很熟悉这些功能的表达语句,他们执行预先存在的转换功能中的一个子集。本文将介绍这三个新功能及他们的用法。

  PARSE

  PARSE允许将一个字符串转换为数字或日期/时间数据类型。虽然任何NVARCHAR(4000)字符串都可以被转换,但是如果它与目标数据类型不匹配则会抛出错误。

  如果需要,可以指定一个culture值;否则,使用当前会话的culture值。Culture值可以是任何.NET所支持的而不仅仅局限于SQL Server所支持的那些。但是如果所提供的culture不正确,函数会返回一个错误。

  PARSE的语法如下:

  PARSE ( string_value AS data_type [ USING culture ] )

  举如下的例子说明这个功能:将一个用字符串表示的英镑付款数转换成货币类型。在这个示例中指定culture值。

  DECLARE @payment MONEY

  
SELECT @payment = PARSE('£3.89' AS MONEY USING 'en-GB')

  
SELECT @payment AS 'Result'

  Result

  
-- -- -- -- -- -- -- -- -- -- -

  
3.89

  (
1 row(s) affected)

  类似的可以将字符串表示的日期时间进行转化,用户需要完成同样的输入。首先,创建一个过程(也可以是一个函数)来接收用字符串表示的日期时间和当前的culture值。如果culture值被写入.NET或在.NET中使用了相同的值,则前后要匹配。

  CREATE PROCEDURE parse_datetime_sp (

  @datetime NVARCHAR(
4000),

  @culture VARCHAR(
10)) AS

  BEGIN

  DECLARE @sql NVARCHAR(
4000)

  
SET @sql = 'SELECT PARSE(''' + @datetime + '''AS DATETIME USING ''' + @culture + ''')'

  EXEC sp_executesql @sql

  
END

  现在将不同的culture值给存储过程来看一下PARSW在设定culture值的前提下是怎么样工作的。

  EXEC parse_datetime_sp '12/31/2012', 'en-US'

  Result:

  
-- -- -- -- -- -- -- -- -- -- -- -

  
2012-12-31 00:00:00.000

  (
1 row(s) affected)

  给予一个适当的转换格式。

  EXEC parse_datetime_sp '12/31/2012', 'fr-FR'

  Result:

  
-- -- -- -- -- -- -- -- -- -- -- -

  Msg
9819, Level 16, State 1, Line 1

  将字符串’12/31/2012’转换为日期时间数据类型而把culture值设置为’fr-FR’是错误的。

  这时将出现错误,因为这里指定的culture值是无效的。

  EXEC parse_datetime_sp '31/12/2012', 'fr-FR'

  Result:

  
-- -- -- -- -- -- -- -- -- -- -- -

  
2012-12-31 00:00:00.000

  (
1 row(s) affected)

  将其修改后,可以正常转换。

${PageNumber}

  TRY_PARSE

  TRY_PARSE和PARSE类似,将字符串通过给定的culture值(可选)转换为数字或日期/时间型数据。如果没有指定culture值,使用当前对话所设定的语言。

  TRY_PARSE语法如下:

  TRY_PARSE ( string_value AS data_type [ USING culture ] )

  TRY_PARSE和PARSE的不同在于如果选择的类型转换不成功,则返回Null。同PARSE类似,它也要使用在服务器端可用的.NET公共语言运行时 (CLR)。它只能用于SQL Server 2012及之后的版本中,不可以在之前的版本中使用。

  使用先前PARSE所举的例子,在付款中使用了错误的格式。因为转换失败,所以导致变量@payment包含Null。

  DECLARE @payment MONEY

  
SELECT @payment = TRY_PARSE('£3-89' AS MONEY USING 'en-GB')

  
IF @payment IS NULL

  
SELECT 'Parse Failed' AS 'Result'

  
ELSE

  
SELECT @payment AS 'Result'

  Result

  
-- -- -- -- -- -- -- -- -- --

  Parse Failed

  (
1 row(s) affected)

  以下对于Money和会话前设定的语言执行相同的转换。

  SET LANGUAGE British

  DECLARE @payment MONEY

  
SELECT @payment = TRY_PARSE('£3.89' AS MONEY)

  
IF @payment IS NULL

  
SELECT 'Parse Failed' AS 'Result'

  
ELSE

  
SELECT @payment AS 'Result'

  Result

  
-- -- -- -- -- -- -- -- -- -- -

  
3.89

  (
1 row(s) affected)

  现在执行与PARSE同样的存储过程,将用字符串表示的日期/时间数据转换为日期时间数据类型,通过使用不同的值来观察TRY_PARSE是如何工作的。

  EXEC parse_datetime_sp '12/31/2012', 'fr-FR'

  Result:

  
-- -- -- -- -- -- -- -- -- -- -- -

  
NULL

  (
1 row(s) affected)

  当转换失败时,TRY_PARSE没有提示出错而是返回Null。

  EXEC parse_datetime_sp '31/12/2012', 'fr-FR'

  Result:

  
-- -- -- -- -- -- -- -- -- -- -- -

  
2012-12-31 00:00:00.000

  (
1 row(s) affected)

  对于正确的日期时间格式,转换成功。

${PageNumber}

  TRY_CONVERT

  在例如将字母字符转换为数字类型方面,除了在不能完成转换时返回Null之外,TRY_CONVERT功能与CONVERT功能极为类似。当由于表达式的数据类型不允许转换为指定的数据类型而导致转换失败时,将抛出一个错误。

  TRY_CONVERT的格式如下:

  TRY_CONVERT ( data_type [ ( length ) ], expression [, style ] )

  注意,您有与CONVERT函数同样的可以指定style的选项。对于此您可以参考CAST和CONVERT主题的style值清单以及允许转换的数据类型。

  这里有一个例子演示将一个字符串转换成日期时间数据类型,如果用户没有正确的输入,会返回Null。

  DECLARE @stringparm VARCHAR(30),

  @result VARCHAR(
30)

  
SET @stringparm = '2/30/2012'

  
SELECT @result = CASE WHEN TRY_CONVERT (datetime, @stringparm)

  
IS NULL THEN 'Bad Date'

  
ELSE 'Good Date'

  
END

  
SELECT @result

  Result:

  
-- -- -- -- -- -- -- -- -- --

  Bad
Date

  (
1 row(s) affected)

  结论

  SQL Server 2012新的转换功能提供了与基本表达语言相类似的字符串转换能力。PARSE和TRY_PARSE基于.NET CLR的可用性。使用这两个功能将字符串转换为数字或日期/时间数据类型时,要明确culture值。TRY_PARSE和TRY_CONVERT当转换失败时返回Null。之前就有的转换函数CAST和CONVERT任然可以使用而且不依赖于.NET CLR。

0
相关文章