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

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

语法

 
  1. Syntax for CAST:
  2. CAST ( expression AS data_type [ ( length ) ] )
  3.  
  4. Syntax for CONVERT:
  5. 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
仅保证往返转换(即从原始数据类型进行转换后又返回原始数据类型的转换)在各版本间产生相同值。以下示例显示的即是这样的往返转换:

  复制代码
  1. DECLARE @myval decimal (5, 2)
  2. SET @myval = 193.57
  3. SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
  4. -- Or, using CONVERT
  5. SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))
注意:
不要尝试构造 binary 值然后将其转换为数值数据类型类别的一种数据类型。SQL Server 不能保证 decimalnumeric 数据类型到 binary 的转换结果在 SQL Server 的各个版本中都相同。

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

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

  复制代码
  1. -- Use CAST
  2. USE AdventureWorks2008R2;
  3. GO
  4. SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
  5. FROM Production.Product
  6. WHERE CAST(ListPrice AS int) LIKE '3%';
  7. GO
  8.  
  9. -- Use CONVERT.
  10. USE AdventureWorks2008R2;
  11. GO
  12. SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
  13. FROM Production.Product
  14. WHERE CONVERT(int, ListPrice) LIKE '3%';
  15. GO

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

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

  复制代码
  1. USE AdventureWorks2008R2;
  2. GO
  3. SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS 'Computed'
  4. FROM Sales.SalesPerson
  5. WHERE CommissionPCT != 0;
  6. GO

下面是结果集:

Computed

------

379753754

346698349

257144242

176493899

281101272

0

301872549

212623750

298948202

250784119

239246890

101664220

124511336

97688107

(14 row(s) affected)

C. 使用 CAST 进行连接

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

  复制代码
  1. USE AdventureWorks2008R2;
  2. GO
  3. SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice
  4. FROM Production.Product
  5. WHERE ListPrice BETWEEN 350.00 AND 400.00;
  6. 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) 列。

  复制代码
  1. USE AdventureWorks2008R2;
  2. GO
  3. SELECT DISTINCT CAST(p.Name AS char(10)) AS Name, s.UnitPrice
  4. FROM Sales.SalesOrderDetail s JOIN Production.Product p on s.ProductID = p.ProductID
  5. WHERE Name LIKE 'Long-Sleeve Logo Jersey, M';
  6. 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 子句。

  复制代码
  1. USE AdventureWorks2008R2;
  2. GO
  3. SELECT p.FirstName, p.LastName, s.SalesYTD, s.BusinessEntityID
  4. FROM Person.Person p JOIN Sales.SalesPerson s ON p.BusinessEntityID = s.BusinessEntityID
  5. WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%';
  6. 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,并删除所有无用空格(节点之间的边界空格):

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

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

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

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

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

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

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

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

  复制代码
  1. SELECT
  2. GETDATE() AS UnconvertedDateTime,
  3. CAST(GETDATE() AS nvarchar(30)) AS UsingCast,
  4. CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601 ;
  5. 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 数据类型。

  复制代码
  1. SELECT
  2. '2006-04-25T15:50:59.997' AS UnconvertedText,
  3. CAST('2006-04-25T15:50:59.997' AS datetime) AS UsingCast,
  4. CONVERT(datetime, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;
  5. 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

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

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

下面是结果集:

Style 0, binary to character

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

Name

(1 row(s) affected)

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

下面是结果集:

Style 1, binary to character

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

0x4E616D

(1 row(s) affected)

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

下面是结果集:

Style 2, binary to character

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

4E616D65

(1 row(s) affected)

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

下面是结果集:

Style 0, character to binary

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

0x4E616D6500000000

(1 row(s) affected)

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

下面是结果集:

Style 1, character to binary

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

0x4E616D65

(1 row(s) affected)

  复制代码
  1. 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. 数据结构(C语言)关于树、二叉树、图的基本操作。

    1) 编写算法函数int equal(tree t1, tree t2),判断两棵给定的树是否等价: int equal(tree t1,tree t2) { int k; if(t1==NULL&a ...

  2. js 的垃圾回收器 原理 坑 优化-- 待续

    JavaScript垃圾回收的机制很简单: 找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是时时的, 因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行. 什么叫不再使用的变 ...

  3. php 特殊字符

    今天碰到一个处理文件特殊字符的事情,再次注意到这个问题,在php中: * 以单引号为定界符的php字符串,支持两个转义\'和\\ * 以双引号为定界符的php字符串,支持下列转义:     \n 换行 ...

  4. 玩转树莓派:OpenHAB的入门(一)

    如果你对那些仅仅只是为了控制一盏灯而不得不下载一个特定的App的智能家居感到厌烦,这里有个好消息:OpenHAB可以为你实现最灵活的控制智能家居,OpenHAB是一个成熟的,开源的家庭自动化平台,既可 ...

  5. ZedGraph实时曲线实例

    2010-10-17 11:23:58| 分类: ASP.NET |举报|字号 订阅public partial class FrmMain : Form { // 起始时间以毫秒为单位 int ti ...

  6. SWIFT中正则表达式验证邮箱

    在playground内写入以下代码,正则关键字跟其它语言的没什么区别 class Regex { let internalExpression:NSRegularExpression let pat ...

  7. 2016 ACM/ICPC Asia Regional Qingdao Online 1001 I Count Two Three(打表+二分搜索)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  8. Vue.js使用v-show和v-if的注意事项

    这篇文章一开始先对Vue.js中v-show和v-if两者的区别进行了简单的介绍,而后通过图文详细给大家介绍了Vue.js使用v-show和v-if注意的事项,有需要的朋友们可以参考借鉴,下面来一起看 ...

  9. shell 脚本实战笔记(8)--ssh免密码输入执行命令

    前言: ssh命令, 没有指定密码的参数. 以至于在脚本中使用ssh命令的时候, 必须手动输入密码, 才能继续执行. 这样使得脚本的自动化执行变得很差, 尤其当ssh对应的机器数很多的时候, 会令人抓 ...

  10. XML教程、语法手册、数据读取方式大全

    XML简单易懂教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 XML --数据格式的写法 二 Re ...