转换函数

如果 SQL Server 没有自动执行数据类型的转换,可以使用 CAST 和 CONVERT 转换函数将一种数据类型的表达式转换为另一种数据类型的表达式。例如,如果比较 char 和 datetime 表达式、smallint 和 int 表达式或不同长度的 char 表达式,则 SQL Server 自动对这些表达式进行转换。这种转换称为隐式转换。不必使用 CAST 或 CONVERT 来进行这些隐式转换。但可以在下列转换方案中使用 CAST 和 CONVERT:

  • 两个表达式的数据类型完全相同。

  • 两个表达式可以隐式转换。

  • 需要隐式转换数据类型。

如果尝试进行不可能的转换(例如,将包括字母的 char 表达式转换为 int),SQL Server 将显示错误消息。

此外,CAST 函数和 CONVERT 函数还可用于获取各种特殊数据格式,并可用于选择列表、WHERE 子句以及允许使用表达式的任何位置中。

如果希望 Transact-SQL 程序代码符合 SQL-92,请使用 CAST 而不要使用 CONVERT。如果要利用 CONVERT 中的功能,请使用 CONVERT 而不要使用 CAST。

使用 CAST 或 CONVERT 时,需要提供以下信息:

  • 要转换的表达式;例如,销售报表要求销售数据从货币数据转换为字符数据。

  • 要将指定的表达式转换为的数据类型,例如 varchar 或其他 SQL Server 系统数据类型。

除非将被转换的值存储起来,否则转换仅在 CAST 函数或 CONVERT 函数的作用时间范围内有效。

如果转换时没有指定数据类型的长度,则 SQL Server 自动将 30 作为长度值。

示例

下面的示例在第一个 SELECT 语句中使用 CAST,并在第二个 SELECT 语句中使用 CONVERT,以将 Title 列转换为 nvarchar(20) 列,从而使标题的长度更短。

USE AdventureWorks2008R2;
GO
SELECT CAST(Title AS nvarchar(20)) AS Title, Revision
FROM Production.Document
WHERE Revision < 2 ;
GO

或者

USE AdventureWorks2008R2;
GO
SELECT CONVERT(nvarchar(20), Title) AS Title, Revision
FROM Production.Document
WHERE Revision < 2 ;
GO

下面是任一查询的结果集。

Title Revision

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

Crank Arm and Tire M 0

Front Reflector Brac 1

Installing Replaceme 0

Repair and Service G 0

Training Wheels 2 1

(5 row(s) affected)

在下面的示例中,HireDate 列(一个 datetime 列)转换为 char(11) 列。

USE AdventureWorks2008R2 ;
GO
SELECT p.FirstName, p.LastName, CAST(e.HireDate AS char(11)) AS HireDate 
FROM HumanResources.Employee AS e 
JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID
WHERE p.FirstName = 'Kim' ;
GO

下面是结果集:

FirstName       LastName                  HireDate

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

Kim             Abercrombie               2004-02-17

Kim             Akers                     2003-01-27

(2 row(s) affected)