将一种数据类型的表达式显式转换为另一种数据类型的表达式。CAST 和 CONVERT 提供相似的功能。

Transact-SQL 语法约定

语法

 Syntax for CAST: CAST ( expression AS data_type [ (length ) ])  Syntax for CONVERT: CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

参数

expression

任何有效的表达式。

data_type

作为目标的系统提供数据类型。这包括 xmlbigintsql_variant。不能使用别名数据类型。有关可用数据类型的详细信息,请参阅数据类型 (Transact-SQL)。

length

ncharnvarcharcharvarcharbinaryvarbinary 数据类型的可选参数。对于 CONVERT,如果未指定 length,则默认为 30 个字符。

style

数据格式的样式,用于将 datetimesmalldatetime 数据转换成字符数据(ncharnvarcharcharvarcharncharnvarchar 数据类型),或将已知日期或时间格式的字符数据转换成 datetimesmalldatetime 数据;或者是字符串格式,用于将 floatrealmoneysmallmoney 数据转换成字符数据(ncharnvarcharcharvarcharncharnvarchar 数据类型)。如果 style 为 NULL,则返回的结果也为 NULL。

注意:
SQL Server 支持本主题中列出的样式与 CONVERT 目标数据类型的所述组合。不支持所有其他样式和组合。请不要使用任何不支持的样式。如果使用不支持的样式或不支持的样式与目标数据类型的组合,则可能会返回错误或不可靠的结果。所有版本的 SQL Server 都不能保证这些结果的准确性。

SQL Server 通过使用科威特算法来支持阿拉伯样式的日期格式。

在下表中,左侧的两列表示将 datetimesmalldatetime 数据转换为字符数据的 style 值。将 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。

不带世纪数位 (yy) (1) 带世纪数位 (yyyy) 标准 输入/输出 (3)

-

0100 (1,2)

默认设置

mon dd yyyy hh:miAM(或 PM)

1

101

美国

mm/dd/yyyy

2

102

ANSI

yy.mm.dd

3

103

英国/法国

dd/mm/yy

4

104

德国

dd.mm.yy

5

105

意大利

dd-mm-yy

6

106 (1)

-

dd mon yy

7

107 (1)

-

mon dd, yy

8

108

-

hh:mi:ss

-

9109 (1,2)

默认设置 + 毫秒

mon dd yyyy hh:mi:ss:mmmAM(或 PM)

10

110

美国

mm-dd-yy

11

111

日本

yy/mm/dd

12

112

ISO

yymmdd

-

13113 (1,2)

欧洲默认设置 + 毫秒

dd mon yyyy hh:mi:ss:mmm(24h)

14

114

-

hh:mi:ss:mmm(24h)

-

20120 (2)

ODBC 规范

yyyy-mm-dd hh:mi:ss(24h)

-

21121 (2)

ODBC 规范(带毫秒)

yyyy-mm-dd hh:mi:ss.mmm(24h)

-

126 (4)

ISO8601

yyyy-mm-ddThh:mi:ss.mmm(无空格)

 

127(6, 7)

带时区 Z 的 ISO8601。

yyyy-mm-ddThh:mi:ss.mmmZ

(无空格)

-

130 (1,2)

回历 (5)

dd mon yyyy hh:mi:ss:mmmAM

-

131 (2)

回历 (5)

dd/mm/yy hh:mi:ss:mmmAM

1 这些样式值将返回不确定的结果。包括所有 (yy)(不带世纪数位)样式和一部分 (yyyy)(带世纪数位)样式。

2 默认值(style 010091091311320120 以及 21121)始终返回世纪数位 (yyyy)。

3 转换为 datetime 时输入;转换为字符数据时输出。

4 为用于 XML 而设计。对于从 datetimesmalldatetime 到字符数据的转换,其输出格式如上一个表所述。

5 回历是有多种变体的日历系统。SQL Server 2005 使用科威特算法。

重要提示:
默认情况下,SQL Server 基于截止年份 2049 年来解释两位数的年份。换言之,就是将两位数的年份 49 解释为 2049,将两位数的年份 50 解释为 1950。许多客户端应用程序(如基于自动化对象的应用程序)都使用截止年份 2030 年。SQL Server 提供了“两位数年份截止”配置选项,可通过此选项更改 SQL Server 使用的截止年份,从而对日期进行一致处理。建议您指定四位数年份。

6 仅支持从字符数据转换为 datetimesmalldatetime。仅表示日期或时间成分的字符数据转换为 datetimesmalldatetime 数据类型时,未指定的时间成分设置为 00:00:00.000,未指定的日期成分设置为 1900-01-01。

7使用可选的时间区域指示符 (Z) 更便于将具有时区信息的 XML datetime 值映射到没有时区的 SQL Server datetime 值。Z 是时区 UTC-0 的指示符。其他时区则以 + 或 - 方向的 HH:MM 偏移量来指示。例如:2006-12-12T23:45:12-08:00

smalldatetime 转换为字符数据时,包含秒或毫秒的样式将在这些位置上显示零。使用相应的 charvarchar 数据类型长度从 datetimesmalldatetime 值转换时,可截断不需要的日期部分。

下表显示可用来将 floatreal 转换为字符数据的 style 值。

输出

0(默认值)

最多包含 6 位。根据需要使用科学记数法。

1

始终为 8 位值。始终使用科学记数法。

2

始终为 16 位值。始终使用科学记数法。

注意:
如果为 floatreal 转换指定样式 126,则输出分别等同于 style 值为 21

下表显示可用来将 moneysmallmoney 转换为字符数据的 style 值。

输出

0(默认值)

小数点左侧每三位数字之间不以逗号分隔,小数点右侧取两位数,例如 4235.98。

1

小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数,例如 3,510.92。

2

小数点左侧每三位数字之间不以逗号分隔,小数点右侧取四位数,例如 4235.9819。

注意:
如果为从 moneysmallmoney 到字符数据的转换指定样式 126,则输出等同于 style 值为 2

下表显示可用来将字符串输入转换为 xml 数据的 style 值。

输出

0(默认值)

使用默认的分析行为,即放弃无用的空格,且不允许使用内部 DTD 子集。

注意:
转换为 xml 数据类型时,SQL Server 2005 的无用空格处理方式不同于 XML 1.0。有关详细信息,请参阅生成 XML 实例。

1

保留无用空格。此样式设置将默认的 xml:space 处理方式设置为与指定了 xml:space="preserve" 的行为相同。

2

启用有限的内部 DTD 子集处理。

如果启用,则服务器可使用内部 DTD 子集提供的以下信息来执行非验证分析操作。

  • 应用属性的默认值。
  • 解析并扩展内部实体引用。
  • 检查 DTD 内容模型以实现语法的正确性。

分析器将忽略外部 DTD 子集。此外,不评估 XML 声明来查看 standalone 属性是设置为 yes 还是 no,而是将 XML 实例当成一个独立文档进行分析。

3

保留无用空格,并启用有限的内部 DTD 子集处理。

返回类型

返回与 data_type 相同的值。

备注

隐式转换指那些没有指定 CAST 或 CONVERT 函数的转换。显式转换指那些需要指定 CAST 或 CONVERT 函数的转换。以下图例显示了可对 SQL Server 2005 系统提供的数据类型执行的所有显式和隐式数据类型转换。其中包括 xmlbigintsql_variant。不存在对 sql_variant 数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant 的隐式转换。

注意:
因为 Unicode 数据始终使用偶数个字节,所以在 binaryvarbinary 与支持 Unicode 的数据类型之间进行转换时会使用警告。例如,以下转换不返回十六进制值 41;而是返回 4100:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

大值数据类型

大值数据类型表现出与小值数据类型相同的隐式和显式转换行为,特别是 varcharnvarcharvarbinary 数据类型。但是,应该考虑以下原则:

  • imagevarbinary(max) 的转换与反向转换是隐式转换,textvarchar(max)ntextnvarchar(max) 之间的转换也是隐式转换。
  • 从大值数据类型(如 varchar(max))到小值数据类型(如 varchar)的转换是隐式转换,但如果大值相对于指定长度的小值数据类型显得太大,则产生截断。
  • varcharnvarcharvarbinary 到其相应的大值数据类型的转换都是隐式执行的。
  • sql_variant 数据类型到大值数据类型的转换是显式转换。
  • 大值数据类型不能转换为 sql_variant 数据类型。

有关转换 Microsoft .NET Framework 公共语言运行时 (CLR) 用户定义类型的信息,请参阅对用户定义类型执行操作。有关从 xml 数据类型进行转换的详细信息,请参阅生成 XML 实例。

xml 数据类型

当您将 xml 数据类型显式或隐式转换为字符串或二进制数据类型时,xml 数据类型的内容将根据一组规则进行序列化。有关这些规则的信息,请参阅 XML 数据的序列化。有关如何从 XML 转换为 CLR 用户定义类型的信息,请参阅对用户定义类型执行操作。有关从其他数据类型转换为 xml 数据类型的信息,请参阅生成 XML 实例。

文本和图像数据类型

不支持对 textimage 数据类型进行自动数据类型转换。可将 text 数据显式转换为字符数据,将 image 数据转换为 binaryvarbinary,但最大长度是 8000 字节。如果试图进行不正确的转换,如将包含字母的字符表达式转换为 int,则 SQL Server 将返回错误消息。

输出的排序规则

如果 CAST 或 CONVERT 的输出是字符串,并且输入也是字符串,则输出将与输入具有相同的排序规则和排序规则标签。如果输入不是字符串,则输出采用数据库的默认排序规则以及强制默认的排序规则标签。有关详细信息,请参阅排序规则优先级 (Transact-SQL)。

若要为输出分配不同的排序规则,请将 COLLATE 子句应用于 CAST 或 CONVERT 函数的结果表达式。例如:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

截断结果和舍入结果

将字符或二进制表达式(charncharnvarcharvarcharbinaryvarbinary)转换为其他数据类型的表达式时,可截断数据,仅显示部分数据,或返回错误(因为结果太短而无法显示)。除了下表显示的转换,其他到 charvarcharncharnvarcharbinaryvarbinary 的转换都将被截断。

被转换的数据类型 转换为的数据类型 结果

intsmallinttinyint

char

*

varchar

*

nchar

E

nvarchar

E

moneysmallmoneynumericdecimalfloatreal

char

E

varchar

E

nchar

E

nvarchar

E

* = 结果长度太短而无法显示。E = 因为结果长度太短无法显示而返回错误。

SQL Server 仅保证往返转换(即从原始数据类型进行转换后又返回原始数据类型的转换)在各版本间产生相同值。以下示例显示的即是这样的往返转换:

复制代码
DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))

注意:
不要尝试构造 binary 值然后将其转换为数值数据类型类别的一种数据类型。SQL Server 不能保证 decimalnumeric 数据类型到 binary 的转换结果在 SQL Server 的各个版本中都相同。

以下示例显示了由于太小而无法显示的结果表达式。

复制代码
USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName, SUBSTRING(c.Title, 1, 25) AS Title, CAST(e.SickLeaveHours AS char(1)) AS 'Sick Leave'
FROM HumanResources.Employee e JOIN Person.Contact c ON e.EmployeeID = c. ContactID
WHERE NOT EmployeeID >5

下面是结果集:

复制代码
FirstName      LastName         Title                  Sick Leave
---------      ---------      -------------------   -----------
Gustavo        Achong         Mr.                   *
Catherine      Abel           Ms.                   *
Kim            Abercrombie    Ms.                   *
Humberto       Acevedo        Sr.                   *
Pilar          Ackerman       Sra.                  *

(5 row(s) affected)

转换小数位数不同的数据类型时,结果值有时被截断,有时被舍入。下表显示了此行为。

被转换的数据类型 转换为的数据类型 行为

numeric

numeric

舍入

numeric

int

截断

numeric

money

舍入

money

int

舍入

money

numeric

舍入

float

int

截断

float

numeric

舍入

float

datetime

舍入

datetime

int

舍入

例如,以下转换的结果为 10

SELECT CAST(10.6496 AS int)

在进行数据类型转换时,若目标数据类型的小数位数小于源数据类型的小数位数,则该值将被截断。例如,以下转换的结果为 $10.3497

SELECT CAST(10.3496847 AS money)

当非数字型 charncharvarcharnvarchar 数据转换为 intfloatnumericdecimal 时,SQL Server 将返回错误消息。当空字符串 (" ") 转换为 numericdecimal 时,SQL Server 也返回错误。

转换二进制字符串数据

如果 binaryvarbinary 数据转换为字符数据,并且在 x 后面指定了奇数位的值,则 SQL Server 将在 x 后面添加一个 0(零)使其成为偶数位值。

二进制数据由从 0 到 9 和从 A 到 F(或从 a 到 f)的字符组成,每两个字符为一组。二进制字符串必须以 0x 开头。例如,若要输入 FF,需要键入 0xFF。最大值是一个 8000 字节的二进制值,每个字节都是 FF。binary 数据类型不能用于十六进制数据,而是用于位模式。对于存储为二进制数据的十六进制数字的转换和计算结果,无法保证其可靠性。

指定 binary 数据类型的长度时,每两个字符被算作是一个单位长度。长度 10 表示将输入 10 个双字符组。

由 0x 表示的空二进制字符串可以存储为二进制数据。

 示例

A. 同时使用 CAST 和 CONVERT

每个示例都检索列表价格的第一位是 3 的产品的名称,并将 ListPrice 转换为 int

复制代码
-- Use CAST
USE AdventureWorks;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS int) LIKE '3%';
GO

-- Use CONVERT.
USE AdventureWorks;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CONVERT(int, ListPrice) LIKE '3%';
GO

B. 使用包含算术运算符的 CAST

以下示例将本年度截止到现在的全部销售额 (SalesYTD) 除以佣金百分比 (CommissionPCT),从而得出单列计算结果 (Computed)。在舍入到最接近的整数后,将此结果转换为 int 数据类型。

复制代码
USE AdventureWorks;
GO
SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS 'Computed'
FROM Sales.SalesPerson
WHERE CommissionPCT != 0;
GO

下面是结果集:

复制代码
Computed
------
379753754
346698349
257144242
176493899
281101272
0
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107

(14 row(s) affected)

C. 使用 CAST 进行连接

以下示例使用 CAST 连接非字符型非二进制表达式。

复制代码
USE AdventureWorks;
GO
SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice
FROM Production.Product
WHERE ListPrice BETWEEN 350.00 AND 400.00;
GO

下面是结果集:

复制代码
ListPrice
------------------
The list price is 357.06
The list price is 364.09
The list price is 364.09
The list price is 364.09
The list price is 364.09

(5 row(s) affected)

D. 使用 CAST 生成可读性更高的文本

以下示例使用选择列表中的 CASTName 列转换为 char(10) 列。

复制代码
USE AdventureWorks;
GO
SELECT DISTINCT CAST(p.Name AS char(10)) AS Name, s.UnitPrice
FROM Sales.SalesOrderDetail s JOIN Production.Product p on s.ProductID = p.ProductID
WHERE Name LIKE 'Long-Sleeve Logo Jersey, M';
GO

下面是结果集:

复制代码
Name       UnitPrice
---------- ---------------------
Long-Sleev 31.2437
Long-Sleev 32.4935
Long-Sleev 49.99

(3 row(s) affected)

E. 使用包含 LIKE 子句的 CAST

以下示例将 moneySalesYTD 转换为 int,然后再转换为 char(20) 列,以便可以将其用于 LIKE 子句。

复制代码
USE AdventureWorks;
GO
SELECT p.FirstName, p.LastName, s.SalesYTD, s.SalesPersonID
FROM Person.Contact p JOIN Sales.SalesPerson s ON p.ContactID = s.SalesPersonID
WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%';
GO

下面是结果集:

复制代码
FirstName        LastName            SalesYTD         SalesPersonID
---------------- ------------------- ---------------- -------------
Carol            Elliott             2811012.7151      279
Julie            Estes               219088.8836       288
Janeth           Esteves             2241204.0424      289

(3 row(s) affected)

F. 使用包含类型化的 XML 的 CONVERT 或 CAST

下面的几个示例显示如何通过 xml 数据类型使用 CONVERT 转换为类型化的 XML。

此示例将包含空格、文本和标记的字符串转换为类型化的 XML,并删除所有无用空格(节点之间的边界空格):

复制代码
CONVERT(XML, '<root><child/></root>')

此示例将包含空格、文本和标记的类似字符串转换为类型化的 XML,并保留无用空格(节点之间的边界空格):

复制代码
CONVERT(XML, '<root>          <child/>         </root>', 1)

此示例将包含空格、文本和标记的字符串转换为类型化的 XML:

复制代码
CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)

有关详细信息,请参阅生成 XML 实例。

G. 对日期时间数据使用 CAST 和 CONVERT

以下示例显示了当前日期和时间,并使用 CAST 将当前日期和时间改为字符数据类型,然后使用 CONVERTISO 8901 格式显示日期和时间。

复制代码
SELECT
GETDATE() AS UnconvertedDateTime,
CAST(GETDATE() AS nvarchar(30)) AS UsingCast,
CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601  ;
GO

下面是结果集:

UnconvertedDateTime     UsingCast                      UsingConvertTo_ISO8601

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

2006-04-18 09:58:04.570 Apr 18 2006 9:58AM            2006-04-18T09:58:04.570

(1 row(s) affected)

以下示例大致与上述示例相反。该示例将日期和时间显示为字符数据,并使用 CAST 将字符数据改为 datetime 数据类型,然后使用 CONVERT 将字符数据改为 datetime 数据类型。

复制代码
SELECT
'2006-04-04T15:50:59.997' AS UnconvertedText,
CAST('2006-04-04T15:50:59.997' AS datetime) AS UsingCast,
CONVERT(datetime, '2006-04-04T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;
GO

下面是结果集:

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601

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

2006-04-04T15:50:59.997 2006-04-04 15:50:59.997 2006-04-04 15:50:59.997

(1 row(s) affected)

sql server 2005 T-SQL CAST 和 CONVERT (Transact-SQL)相关推荐

  1. 打破第一范式的要求 (中英对照)Michael Rys 对 SQL Server 2005 中XML 的 评论——对微软SQL Server项目经理Michael Rys博士的采访

    Michael Rys on XML in SQL Server 2005 Michael Rys对SQL Server 2005中XML的评论 Michael Rys is one of two p ...

  2. 安装SQL Server2008 r2 提示SQL Server 2005 Express 工具失败和完全卸载SQL Server数据库操作流程

    第一种简单情况可以测试: 32位修改注册表路径:HKLM\Software\Microsoft\Microsoft SQL Server\90\Tools\ShellSEM,把ShellSEM重命名即 ...

  3. SQL SERVER中强制类型转换cast和convert的区别

    在SQL SERVER中,cast和convert函数都可用于类型转换,其功能是相同的, 只是语法不同. cast一般更容易使用,convert的优点是可以格式化日期和数值. 代码 select CA ...

  4. SQL Server中的几个方法和Transact SQL 常用语句以及函数[个人推荐]

    --数据操作   SELECT --从数据库表中检索数据行和列  INSERT --向数据库表添加新数据行  DELETE --从数据库表中删除数据行  UPDATE --更新数据库表中的数据  -- ...

  5. sql server 2005管理员手册_执行一条sql语句都经历了什么?

    每天都在跟 mysql 打交道,你知道执行一条简单的 select 语句,都经历了哪些过程吗? 首先,mysql 主要是由 server 层和存储层两部分构成的.server 层主要包括连接器.查询缓 ...

  6. 转:探讨SQL Server 2005的安全策略

    一.简介 SQL Server 2005是继SQL Server 2000之后的又一次重大成功.单从安全方面看,它在认证和授权方面比以往都有了大幅度的提高:同时,它还提供了本机加密支持-能够实现比以往 ...

  7. 黄聪:SQL server 2005高可用性之----数据库镜像

    SQL server 2005高可用性之数据库镜像,是SQL server 2005的新技术之一,是一种基于软件的高可用性解决方案,可以对不同服务器或同一服务器不同实例之间的数据库实验无数据延迟,自动 ...

  8. 实验二:SQL server 2005高可用性之----数据库镜像

    如转载,请注明出处:http://blog.csdn.net/robinson_0612/archive/2009/11/04/4769060.aspx SQL server 2005高可用性之数据库 ...

  9. 数据库开发基本操作-关于sql server 2005 未开放1433端口的问题

    有些sql server 2005在安装过程中,可能将SQL server 服务的端口配置成了动态端口,没有使用默认的1433端口,从而导致了sql server 2005 的服务启动了,但是却没有开 ...

  10. ASP.NET 2.0在SQL Server 2005上自定义分页

    这篇文章讲述了如何利用SQL Server 2005的新特性来简单高效的实现分页.对于那些暂时还没用到SQL Server2005的人们,请看在大规模数据中的高效分页方法.如果需要,这篇文章会补上这里 ...

最新文章

  1. docker latest标签问题
  2. 大致了解写java聊天器所需要的技术
  3. matlab分类器函数
  4. 全新Wijmo5中文学习指南正式上线
  5. Eclipse在选项卡上展示某个具体的视图
  6. VC++6.0中使用GDI+绘图(转载)
  7. Rust : async、await 初探
  8. 姜启源《数学建模》学习笔记 第一周
  9. ie9服务器win2008系统离线安装包,IE9离线安装包完整版
  10. 如何制作BAT(Windows批处理文件)病毒
  11. android gms集成方法
  12. Linux操作系统基本概述
  13. 吴伯凡-认知方法论-如何增加自己认知的维度
  14. 【Linux】Linux系统编程入门
  15. SAP中生产返工中单独的作业返冲处理分析测试
  16. 手机浏览器 JavaScript 调起百度地图导航
  17. 小米计算机科学计算机,小米计算器APP发布“亲戚计算”功能
  18. css 随机 数,纯CSS实现随机效果
  19. 浏览器缓存及实现原理
  20. EZ-USB FX2 LP CY7C68013A 开发指南(1)--基本概念

热门文章

  1. python 的回调函数
  2. Vue项目自动转换 px 为 rem,高保真还原设计图
  3. 深入Ajax架构和最佳实践读书笔记
  4. linux回调函数的使用
  5. Exchange 2010向外网发邮件的配置
  6. 从零开始学习Sencha Touch MVC应用之八
  7. jquery sortable简述
  8. java版spring cloud+spring boot+redis社交电子商务平台(四)SpringBoot 整合JPA
  9. CentOS7.5常用命令整理
  10. Linux全攻略--MySQL数据库配置与管理