SQL CAST 和 CONVERT
语法
Syntax for CAST: CAST ( expression AS data_type [ (length ) ]) Syntax for CONVERT: CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) |
隐式转换指那些没有指定 CAST 或 CONVERT 函数的转换。显式转换指那些需要指定 CAST 或 CONVERT 函数的转换。以下图例显示了可对 SQL Server 2005 系统提供的数据类型执行的所有显式和隐式数据类型转换。其中包括 xml、bigint 和 sql_variant。不存在对 sql_variant 数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant 的隐式转换。
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 生成可读性更高的文本
以下示例使用选择列表中的 CAST
将 Name
列转换为 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
以下示例将 money 列 SalesYTD
转换为 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) |