两者都用于:将一种数据类型的表达式转换为另一种数据类型的表达式。

安装有 Sql Server 2008 时可以浏览:ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_6tsql/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm

语法

 
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

指定目标数据类型长度的可选整数。默认值为 30。

style

指定 CONVERT 函数如何转换 expression 的整数表达式。如果样式为 NULL,则返回 NULL。该范围是由 data_type 确定的。有关详细信息,请参阅“备注”部分。

返回类型

返回转换为 data_typeexpression

注释

Date 和 Time 样式

如果 expression 为 date 或 time 数据类型,则 style 可以为下表中显示的值之一。其他值作为 0 进行处理。SQL Server 使用科威特算法来支持阿拉伯样式的日期格式。

生成 XML 实例。

1

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

2

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

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

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

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

3

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

二进制样式

如果 expression
binary(n)varbinary(n)char(n)varchar(n),则
style 可以为下表中显示的值之一。表中没有列出的样式值将返回错误。

对用户定义类型执行操作。有关如何从
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

截断结果和舍入结果

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

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

intsmallinttinyint

char

*

 

varchar

*

 

nchar

E

 

nvarchar

E

moneysmallmoneynumericdecimalfloat
real

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 AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName, SUBSTRING(p.Title, 1, 25) AS Title, CAST(e.SickLeaveHours AS char(1)) AS 'Sick Leave'
FROM HumanResources.Employee e JOIN Person.Person p ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID >5;

下面是结果集:

FirstName LastName Title Sick Leave

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

Ken Sanchez NULL *

Terri Duffy NULL *

Roberto Tamburello NULL *

Rob Walters NULL *

Gail Erickson Ms. *

(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 也返回错误。

在 SQL Server 2005 及更高版本中,某些 datetime 转换具有不确定性

在 SQL Server 2000 中,从 string 到 date 和 time 的转换被标记为确定性转换。但是,这对于下表中列出的样式却不成立。对于这些样式,相应的转换取决于语言设置。SQL Server 2005 及更高版本将这些转换标记为不确定性转换。

下表列出了从 string 到 datetime 的转换为不确定性转换的样式。

低于 100 的所有样式1

106

107

109

113

130

1 样式 20 和 21 例外

示例

A. 同时使用 CAST 和 CONVERT

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

  复制代码
-- Use CAST
USE AdventureWorks2008R2;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS int) LIKE '3%';
GO -- Use CONVERT.
USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName, s.SalesYTD, s.BusinessEntityID
FROM Person.Person p JOIN Sales.SalesPerson s ON p.BusinessEntityID = s.BusinessEntityID
WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%';
GO

下面是结果集:

FirstName LastName SalesYTD SalesPersonID

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

Tsvi Reiter 2811012.7151 279

Syed Abbas 219088.8836 288

Rachel Valdez 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-25T15:50:59.997' AS UnconvertedText,
CAST('2006-04-25T15:50:59.997' AS datetime) AS UsingCast,
CONVERT(datetime, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;
GO

下面是结果集:

UnconvertedText UsingCast UsingConvertFrom_ISO8601

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

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

(1 row(s) affected)

H. 对二进制和字符数据使用 CONVERT

以下示例显示了使用不同样式转换二进制和字符数据的结果。

  复制代码
--Convert the binary value 0x4E616d65 to a character value.
SELECT CONVERT(char(8), 0x4E616d65, 0) AS 'Style 0, binary to character'

下面是结果集:

Style 0, binary to character

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

Name

(1 row(s) affected)

  复制代码
--The following example shows how Style 1 can force the result
--to be truncated. The truncation is caused by
--including the characters 0x in the result.
SELECT CONVERT(char(8), 0x4E616d65, 1) AS 'Style 1, binary to character'

下面是结果集:

Style 1, binary to character

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

0x4E616D

(1 row(s) affected)

  复制代码
--The following example shows that Style 2 does not truncate the
--result because the characters 0x are not included in
--the result.
SELECT CONVERT(char(8), 0x4E616d65, 2) AS 'Style 2, binary to character'

下面是结果集:

Style 2, binary to character

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

4E616D65

(1 row(s) affected)

  复制代码
--Convert the character value 'Name' to a binary value.
SELECT CONVERT(binary(8), 'Name', 0) AS 'Style 0, character to binary'

下面是结果集:

Style 0, character to binary

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

0x4E616D6500000000

(1 row(s) affected)

  复制代码
SELECT CONVERT(binary(4), '0x4E616D65', 1) AS 'Style 1, character to binary'

下面是结果集:

Style 1, character to binary

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

0x4E616D65

(1 row(s) affected)

  复制代码
SELECT CONVERT(binary(4), '4E616D65', 2) AS 'Style 2, character to binary'

下面是结果集:

Style 2, character to binary

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

0x4E616D65

(1 row(s) affected)

请参阅

参考

SELECT (Transact-SQL)
系统函数
(Transact-SQL)

其他资源

数据类型转换(数据库引擎)
编写国际化 Transact-SQL
语句

帮助和信息

获取 SQL Server 2008 帮助

© 2010 Microsoft
Corporation。保留所有权利。 

[转]SQL Server 中 Cast 与 Convert的更多相关文章

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

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

  2. SQL Server中时间段查询和数据类型转换

    不知道什么时候对数据独有情种,也许是因为所学专业的缘故,也许是在多年的工作中的亲身经历,无数据,很多事情干不了,数据精度不够,也很多事情干不了,有一次跟一个朋友开玩笑说,如果在写论文的时候,能有一份独 ...

  3. (转)SQL Server中使用convert进行日期转换

    原文链接:http://www.cnblogs.com/weiqt/articles/1826847.html SQL Server中使用convert进行日期转换 一般存入数据库中的时间格式为yyy ...

  4. 【SQL Server】MS SQL Server中的CONVERT日期格式化大全

    CONVERT 函数将某种数据类型的表达式显式转换为另一种数据类型.SQL Server中 将日期格式化. SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式. 在表中,左侧的两列表示将 ...

  5. sql server中的日期详解使用(convert)

    转自:http://blog.csdn.net/hehe520347/article/details/48496853 有个字段值例如2012-07-02 00:00:00.000 转化成 2012- ...

  6. 谈一谈SQL Server中的执行计划缓存(上)

    简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...

  7. Sql Server中Float格式转换字符串varchar方法(转)

    1.[Sql Server](70)  SELECT CONVERT(varchar(100), CAST(@testFloat AS decimal(38,2)))SELECT STR(@testF ...

  8. 如果正确读取SQL Server中的扩展事件?

        SQL Server中使用扩展事件捕捉所需的信息后,可以选择存放的位置.比如说内存或文件中,但无论存在哪里,其本质都是一个大XML.因此在SQL Server中读取该XML就是解析扩展事件结果 ...

  9. 从SQL Server中导入/导出Excel的基本方法(转)

    从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...

随机推荐

  1. 《Python》 面向对象三大特性之多态、封装

    一.多态 1.什么是多态? 一个类表现出的多种状态:通过继承来实现的 在Java中的表现:在一个函数中需要给参数指定数据类型,如果这个地方可以接收两个以上类型的参数,那么这些类型应该有一个父类,这个父 ...

  2. Apache 子项目 概述

    apache HTTP Server--------Web服务器(多用于静态网页,有负载均衡效果,可承受每天数百万人访问).apache Abdera>>>>>>& ...

  3. windows与Linux实现文件传输Winscp工具的使用

    WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它的主要功能就是在本地与远程计算机间安全的复制文件..winscp也可以链接其他系统,比如linux系统 ...

  4. Tomcat学习之二:tomcat安装、配置及目录文件说明

    我们看到tomcat目录/bin文件夹里有个tomcat6w.exe,顾名思义就是tomcat以window方式显示控制台.第1次点击打开它时候,可能会提示:tomcat指定的服务未安装,此时我们可以 ...

  5. Python判断变量的数据类型的两种方法

    https://www.cnblogs.com/jessicaxu/p/7727264.html

  6. MyEclipse junit测试问题initializationError

    问题的情况如上. 问题的解决方法居然是:选中函数的整行,而不是只选中函数名,如下图选中运行junit测试. TestMySQL.testDriverMannager1Unrooted Testsini ...

  7. HTTPS网站的内幕

    什么是HTTPS网站? HTTPS可以理解为HTTP+TLS,HTTP是互联网中使用最为广泛的协议,目前大部分的WEB应用和网站都是使用HTTP协议传输. 那网站为什么要实现HTTPS? 一言概之,为 ...

  8. Balloons Colors

    题目大意:ACMer总觉得题目难度与气球的颜色有关,比如最简单的题目颜色是红色,而最难的题目是黑色的.为了让这个谣言被打破,决定添加一个约束: 气球从1到N编号 题目从1到N编号 接下来给出 N X ...

  9. Python学习-终端字体高亮显示

    1.采用原生转义字符序列,对Windows有的版本不支持(比如win7),完美支持Linux 实现过程: 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以 ...

  10. pandas 里面对nan的判断

    不要用math.isnan() pandas里专门有一个函数: age_null = pd.isnull(titanic_survival[‘age’])