SQL Server 2012 T-SQL系列技巧之T-SQL函数

日期: 2012-12-24 作者:Robert Sheldon翻译:冯昀晖 来源:TechTarget中国 英文

本系列关于SQL Server 2012 T-SQL技巧的文章共分四部分,由SQL Server专家Robert Sheldon提供。第一部分讲的是“数据值的乐趣”,第二部分介绍的是“T-SQL函数”。   TRY_CONVERT函数   新函数“TRY_CONVERT”支持对转换操作进行测试判断。该函数的用法与“TRY_PARSE”类似,如果出错是会返回“NULL”值,而不是报错。

我们来看几个例子,了解一下如何使用这个函数。   下面的“SELECT”语句使用“CONVERT”函数转换字符串“books”为“VARCHAR”数据类型:   SELECT CONVERT(VARCHA……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

本系列关于SQL Server 2012 T-SQL技巧的文章共分四部分,由SQL Server专家Robert Sheldon提供。第一部分讲的是“数据值的乐趣”,第二部分介绍的是“T-SQL函数”。

  TRY_CONVERT函数

  新函数“TRY_CONVERT”支持对转换操作进行测试判断。该函数的用法与“TRY_PARSE”类似,如果出错是会返回“NULL”值,而不是报错。我们来看几个例子,了解一下如何使用这个函数。

  下面的“SELECT”语句使用“CONVERT”函数转换字符串“books”为“VARCHAR”数据类型:

  SELECT CONVERT(VARCHAR(5), 'books');

  如您所见,“SELECT”语句返回“books”,这表示转换是成功的。在下一个例子中“SELECT”语句尝试执行相同的转换,使用“TRY_CONVERT”函数:

  SELECT TRY_CONVERT(VARCHAR(5), 'books');

  同样,由于转换可以执行,所以“SELECT”语句仍然返回“books”。但是,如果我们想把单词“books”转换为“INT”数据类型,如下面的例子所示,看看会返回什么:

  SELECT CONVERT(INT, 'books');

  因为我们用的是“CONVERT”函数,“SELECT”语句返回信息表示转换失败了。然而,如果你使用“ TRY_CONVERT”函数,如下面例子所示,该语句将会返回“NULL”值:

  SELECT TRY_CONVERT(INT, 'books');

  与“TRY_PARSE”函数类似,你可以使用“TRY_CONVERT”函数测试转换是否会失败,然后使用该函数返回的结果控制你的代码逻辑。

  FORMAT函数

  Transact-SQL现在就提供有“FORMAT”函数,支持你把数值转换为基于.NET Framework的格式串。此外,你可以指定返回字符串按照.NET Framework环境进行,这一点也与“PARSE”函数类似。

  例如,下面的“SELECT”语句使用“FORMAT”函数返回当前日期和时间,基于“捷克”语言环境返回默认格式字符串:

  SELECT FORMAT(GETDATE(), '', 'Cs-CZ');

  “FORMAT”函数有三个参数。第一个是待转换数值。本例中,该数值是“GETDATE”函数返回值。第二个参数是格式串,因为本例中指定的是空串,所以就使用默认格式。第三个参数是语言环境代码。同样,这里使用的也是“捷克”代码。最后,该“SELECT”语句返回“4.6.2012 15:13:18”作为当前时间和日期值的展现。

  我们来更进一步看看第二个参数格式串。在下面的例子中,我指定返回值被格式化为周内天数(星期几),月日期,年:

  SELECT FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy', 'Cs-CZ');

  这次返回的结果就大不相同了,是这样的:“pondělí, června 04, 2012”。不过,如果你修改语言文化代码,返回结果将会再次改变。例如,下面的“SELECT”语句使用美国英语文化环境编码:

  SELECT FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy', 'en-US');

  现在该“SELECT”语句返回值变成了“Monday, June 04, 2012”。

  使用“FORMAT”函数的关键是要记得结果是基于一定格式串和语言环境代码生成的。

  CHOOSE函数

  “CHOOSE”函数的功能是从两个或多个值的列表中返回一个值,根据指定索引值进行判断。索引值是从“1”计起的整数,也就是该函数的第一个参数。该参数后面跟着就是值列表。

  下面的例子中,最后的“SELECT”语句使用了“CHOOSE”函数,返回产品名称列表中的第二个值:

  DECLARE @index INT = 2;
  DECLARE @valA VARCHAR(30) =
  (SELECT Name FROM Production.Product WHERE ProductID = 970);
  DECLARE @valB VARCHAR(30) =
  (SELECT Name FROM Production.Product WHERE ProductID = 971);
  DECLARE @valC VARCHAR(30) =
  (SELECT Name FROM Production.Product WHERE ProductID = 972);
  SELECT CHOOSE(@index, @valA, @valB, @valC);

  “ @index”变量被复制为整数“2”,作为第一个参数,表示应该返回值列表中的第二个值。其它参数是基于从“AdventureWorks2012”示例数据库中提取的值形成的。每个值都是一个产品名称。因为该索引设置的值是“2”,所以“CHOOSE”函数返回“ @valB”变量的值(Touring-2000 Blue, 50)。

  IIF函数

  “IIF”函数支持你测试表达式,并基于测试结果返回特定值。“IIF”函数有三个参数:有效的布尔表达式,如果表达式为真返回的值和如果表达式为假返回的值。(你可以把“IIF”函数看作是“CASE”语句的简写版。)

  在下面的例子中,最后的“SELECT”语句使用“IIF”函数比较产品价格与同类产品平均价格的大小:

  DECLARE @ProdID INT = 970;
  DECLARE @ProdPrice MONEY =
  (SELECT ListPrice FROM Production.Product WHERE ProductID = @ProdID);
  DECLARE @AvgPrice MONEY =
  (SELECT AVG(ListPrice) FROM Production.Product
  WHERE ProductNumber LIKE 'bk-%');
  SELECT IIF(@ProdPrice > @AvgPrice, 'true', 'false');

  前三个语句声明了变量,并给它们赋值。“ @ProdPrice”变量包含指定产品的列表价格。“ @AvgPrice”变量包含该类产品的平均价格,产品分类是“WHERE”从句中的条件“ProductNumber LIKE 'bk-%'”决定的。“IIF”函数中的第一个参数是布尔表达式,使用大于号“>”比较操作符来比较“ @ProdPrice”和“ @AvgPrice”的大小。如果该产品价格大于平均价格,表达式就返回真。否则表达式就返回假。

  “IIF”函数的第二个参数是字符串值“true”。也就是说,如果第一个参数的布尔表达式判断结果为真,那么就返回字符串“true”。否则,就返回第三个参数内容,这里是字符串“false”。在本例中,产品价格小于平均价格,所以“IIF”函数返回“false”。

  CONCAT函数

  “CONCAT”函数连接两个或多个字符串值。如果参数不是字符串值,该函数会隐式地把它转换为字符串。即使传递“NULL”值作为参数,该函数也会把它转换为空串。“CONCAT”函数与连接运算符“+”类似,只是“CONCAT”函数处理非字符串和“NULL”值更方便些。

  下面的“SELECT”语句中,“CONCAT”函数连接两个字符串和两列值:

  SELECT CONCAT(Name, ' (', ProductNumber, ')') AS NewName
  FROM Production.Product
  WHERE ProductID = 970;

  要注意,每个参数都是字符串值,从列中来或者是指定字符串序列。在本例中,“ProductName”值是“Touring-2000 Blue, 46”,“ProductNumber”值是“BK-T44U-46”。因为使用了“CONCAT”操作符,该“SELECT”语句返回一个大字符串值“Touring-2000 Blue, 46 (BK-T44U-46)”。

相关推荐