[转]SQL Server 中 Cast 与 Convert

是用于操纵表和视图中的数据的语句,数据操纵语言DML,来源,尽量使用Unicode 数据类型,优先使用连接代替子查询或嵌套查询,6tsql/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm

金沙国际唯一官网网址 7
1.4.1.1.系统全局变量

系统全局变量分为两大类,一类是与自然SQL
Server连接或与当前拍卖有关的全局变量,如@@Rowcount意味着近年来一个言语影响的行数。@@error意味着保留近日实行操作的荒唐状态。一类是与总体SQL
Server系统有关的全局变量,如@@Version表示方今SQL Server的版本音讯。

SELECT @@VERSION AS 当前版本;--查看当前SQL Server的版本信息

结果如图所示
金沙国际唯一官网网址 1

1.3.12.     DDL触发器

一呼百应种种数码定义语言
(DDL) 事件而激情。那一个事件首要与以首要字 CREATE、ALTE途胜 和 DROP 早先的
Transact-SQL 语句对应。执行 DDL 式操作的系统存储进度也能够激起 DDL
触发器。

使用Camel样式命名,命名单词能够描述DDL触发器功用。

示例:

CREATE TRIGGER safety

ON DATABASE

FOR DROP_TABLE, ALTER_TABLE

AS

   PRINT ‘You must
disable Trigger “safety” to drop or alter tables!’

   ROLLBACK ;

其余一种方法为增多ddl前缀,

示例:

CREATE TRIGGER [ddlDatabaseTriggerLog]

ON DATABASE

FOR DDL_DATABASE_LEVEL_EVENTS

AS

3.20.  
TRANSACTION编写
假如在例程中使用两个数据库修改语句,包蕴在三个循环中往往推行五个讲话,就应思考声显明式事务。在SQL
SE奥迪Q3VE福特Explorer 2005 中,扩充了T福睿斯Y块可开展很好的选拔。
实例:
    BEGIN TRY
        BEGIN TRANSACTION;

注释

1.4.Transact-SQL语言基础

1.5.常见命名

1.3.6. 
数据视图
视图名称采取帕斯Carl样式命名,命名格式为v + [视图名称]。
示例:vEmployee
      vSalesPerson

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

3.2.IF ELSE语句块

用于钦赐T-SQL语句的推行尺度,若条件为真,则实行尺度表明式前面包车型大巴话语,条件为假时,能够试用ELSE关键字钦赐要实行的T-SQL语句。举个例子请见示例4

1.3.2. 数据库文件

数据文件:[数据库名称] +
_Data.mdf

日志文件:[数据库名称] +
_Log.ldf

示例:AdventureWorks_Data.mdf

     
AdventureWorks_Log.ldf

1.3.3. 
关系型数据货仓
使用帕斯Carl样式命名,命名格式为[项目俄文名称] + DW。
示例:AdventureWorksDW

二进制样式

如果 expressionbinary(n)varbinary(n)char(n)
varchar(n),则 style
可以为下表中显得的值之一。表中未有列出的样式值将再次回到错误。

1.4.1.常量与变量

常量十分少说。在SQL Server
二〇〇八中,存在二种变量。一种是系统定义和保卫安全的全局变量,一种是顾客定义用来保存中间结果的部分变量。


Author:      Zhanghaifeng

— Create
date: 2006-12-25


Description: H两千报关单回执处理

— Modify
[1]:  郑佐,
二零零六-12-31, 简化逻辑推断流程

— Modify
[金沙国际唯一官网网址,2]:  郑佐,
二零零七-01-20, 更新规范判别

3. 
SQL编写
3.1.
大小写
大写T-SQL
语言的享有首要字,谓词和种类函数。变量名称及游标名称使用帕斯Carl样式。数据类型定义使用成套大写。
示例:DECLARE @LastName nvarchar(32);

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)

1.2.数量垄断(monopoly)语言DML

是用以垄断(monopoly)表和视图中的数据的口舌,举例查询数据(SELECT),插入数据(INSERT),更新数据(UPDATE)和删除数据(DELETE)等。

SQL编写

3.14.  
数值相比较
不要将空的变量值直接与比较运算符(符号)比较。若是变量大概为空,应选择 IS NULL 或 IS NOT NULL 举行比较,也许采取 ISNULL 函数。

出口排序准则

一旦 CAST 或 CONVERT
的输出是字符串,而且输入也是字符串,则输出将与输入具有同样的排序法规和排序法规标签。要是输入不是字符串,则输出选拔数据库的暗中同意排序法则以及强制暗许的排序法规标签。有关详细音信,请参阅排序准绳优先级
(Transact-SQL)。

若要为出口分配分裂的排序准绳,请将 COLLATE 子句应用于 CAST 或 CONVERT
函数的结果表明式。举例:

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

4.常用函数

1.5.1. 常用字段命名

此地的常用字段是指在建表时往往利用的表名或列名,下表对常用字段进行提出性定义,

列名称         
数据类型             表达

CreatedDate    
datetime                纪录创造日期,通常选用GETDATE()自动生成

ModifiedDate       
datetime                纪录最后修改日期,第贰次采用GETDATE()

DeletedDate    
datetime                记录删除(标志删除)日期

StartDate      
datetime                初始日期

EndDate        
datetime                甘休日期

StartTime      
datetime                开头时间

EndTime        
datetime                甘休时间

rowguid        
uniqueidentifier        独一标记行的ROWGUIDCOL号,用于扶助合併复制

ID             
int                 使用ID代替Id或id。平时为自拉长主键列

ParentID           
int                 父ID

Status         
int                 状态

主 XML索引:PXML_[表名称]_[Xml类型列名称]。
示例:PXML_Store_Demographics

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)

1.4.1.2.局地变量

局地变量可以具有一定数据类型,有早晚的功用域,平日用来充当计数器计算或决定循环试行次数,大概用于保存数据值。局地变量前唯有1个@符,用DECLARE语句注脚局地变量。

USE test
DECLARE @StudentId varchar(20)
SET @StudentId=(
SELECT Student.stu_no
FROM Student
WHERE stu_enter_score='603')
SELECT @StudentId AS 入学分数为603的学生学号
GO

结果如图所示
金沙国际唯一官网网址 2

6.3.编辑可移植的 Transact-SQL 代码

http://www.microsoft.com/china/msdn/library/data/sqlserver/USsqldnsqldevdev\_06112004L.mspx

1.3.5. 
数据表
运用帕斯Carl样式命名,命名格式为[表名]。
示例:Employee
      Product

 

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

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 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)

转移小数位数分歧的数据类型时,结果值不时被截断,临时被舍入。下表展现了此展现。

1.1.多少定义语言DDL

是最基础的Transact-SQL语言类型,用来创设数据库和开创,修改,删除数据库中的各类对象,为其余语言的操作提供对象。比如数据库,表,触发器,存款和储蓄进度,视图,函数,索引,类型及客户等都以数据库中的对象。常见的DDL语句包括

CREATE TABLE--创建表
DROP TABLE--删除表
ALTER TABLE--修改表

3.5.默认值

在建构数量表时,尽量使用私下认可值代替NULL值。举例设置CreatedDate列私下认可值为GETDATE()。在有效的状态下设置字段为分歧意空。

即三个变量名是由三片段音讯整合,那样,程序猿很轻松领悟变量的体系、用途,况且方便记念。

示例

2.8.运算符的事先级

优先级 运算符
1 ~(位反)
2 *(乘),/(除),%(取模)
3 +(正),-(负),+(加),+(连接),-(减),&(位与)
4 =,>,<,>=,<=,<>,!=,!>,!<(比较运算符)
5 ^(位异或),位或(符号打不出来,前面有,自己翻)
6 NOT
7 AND
8 ALL,ANY,BETWEEN,IN,LIKE,ALL,SOME
9 =(赋值)

当表明式中的运算符有同样的先行级时,遵照它们在表达式中的地点,一元运算符按从右往左运算,二元运算符(对三个表明式效用的运算符)按从左往右运算。
示例9:验证运算符优先级
实行下列语句

DECLARE @result INT,@num INT
SET @num=45
SET @result=@num+(~@num)*4-@num/(~@num)
SELECT @result AS result
GO

结果如图所示
金沙国际唯一官网网址 3
总结代码中的表明式
@result=@num+(~@num)4-@num/(~@num)
=@num+(-46)
4-@num/(-46)
=45+(-46)4-45/(-46)
=45+(-46)
4
=-139

5.2.Camel 大小写

标记符的首字母小写,各类前边连接的单词的首字母大写,其他字母小写的书写约定。对于缩写的双字母单词,须要它们出现在标志符首部时整个大写,否则全体大写。

例如:applicationException

      id

1.5.
宽广命名
1.5.1. 
常用字段命名
此地的常用字段是指在建表时频仍利用的表名或列名,下表对常用字段进展建议性定义,

截断结果和舍入结果

将字符或二进制表明式(charncharnvarcharvarcharbinary

varbinary)转变为别的数据类型的表明式时,可截断数据,仅呈现部分数据,或回到错误(因为结果太短而可望不可即出示)。除了下表呈现的转移,其余到
charvarcharncharnvarcharbinary
varbinary 的转变都将被截断。

2.运算符

3.8.语句缩进

八个嵌套代码块中的语句使用三个空格的缩进。使用Microsoft
SQL Server Management Studio
,选择“工具”菜单,展开“选项”菜单,在挑选对话框中挑选文本编辑器->纯文本->制表符,选中“插入空格单选框”,设置“制表符大小”为4,缩进大小为“4”。

1.3.4. 
数码架构
除SQL Server
系统定义的多少架构外,新建架构选择帕斯Carl样式命名,命名格式为[架构名]。
示例:HumanResources
      Production

 

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

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

  • 1.选用Transact-SQL语言编制程序
    • 1.1.数码定义语言DDL
    • 1.2.多少操纵语言DML
    • 1.3.数量调整语言DCL
    • 1.4.Transact-SQL语言基础
  • 2.运算符
    • 2.1.算数运算符
    • 2.2.赋值运算符
    • 2.3.位运算符
    • 2.4.比较运算符
    • 2.5.逻辑运算符
    • 2.6.连接运算符
    • 2.7.一元运算符
    • 2.8.运算符的事先级
  • 3.决定语句
    • 3.1.BEGIN
      END语句块
    • 3.2.IF
      ELSE语句块
    • 3.3.CASE分支语句
    • 3.4.WHILE语句
    • 3.5.WAITFORAV4延迟语句
    • 3.6.RETU汉兰达N无条件退出语句
    • 3.7.GOTO跳转语句
    • 3.8.TEnclaveY
      CATCH错误管理语句
  • 4.常用函数
    • 4.1.数据类型转变函数

3.19.   TOP子句

在SQL Server
二零零六中拉长了TOP的选取,尽量选择TOP(变量)来收缩SQL拼串现象。

        INSERT INTO [HumanResources].[EmployeePayHistory] 
            ([EmployeeID]
            ,[RateChangeDate]
            ,[Rate]
            ,[PayFrequency]) 
        VALUES (@EmployeeID, @RateChangeDate, @Rate, @PayFrequency);

参数

expression
别的有效的表明式。

data_type
对象数据类型。那包蕴 xmlbigint
sql_variant。不能够使用外号数据类型。有关可用数据类型的详细消息,请参阅数据类型
(Transact-SQL)。

length
内定目的数据类型长度的可选整数。暗许值为 30。

style
钦命 CONVERT 函数怎么着调换 expression 的莫西干发型表明式。就算体制为
NULL,则赶回 NULL。该限量是由 data_type
分明的。有关详细消息,请参阅“备注”部分。

3.4.WHILE语句

用来安装双重施行T-SQL语句或语句块的尺度。
示例11:用“*”在荧屏上输出贰个大幅为9的菱形。
施行下列语句

DECLARE @width int,@j int
SET @width=9--@width为菱形的最大宽度
SET @j=1--@j表示每行打印的“*”符号的个数
WHILE @j<=@width
BEGIN
PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)--SPACE函数打印n个空字符,REPLICATE打印n个特定字符串
SET @j=@j+2
END
SET @j=@width-2
WHILE @j>0
BEGIN
PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)
SET @j=@j-2
END

结果如图所示
金沙国际唯一官网网址 4

3.4.类型选用

例如字符具备鲜明的尺寸,使用nchar替代nvarchar;char代替varchar。

在唯有五个恐怕数值时,使用bit替代int或smallint。

在SQL Server
2005中,使用nvarchar(MAX)代替ntext;varchar(MAX)代替text;varbinary(MAX)代替image。

在优良的数据表结构中可考虑xml数据类型,达到事半工倍的效果。

1.3.13.    
主键、外键关系和目录
主键: PK_[表名称]_[主键];借使是组成主键,使用PK_[表名]_[主键1]_[主键2]。
示例:PK_Store_CustomerID
  PK_StoreContact_CustomerID_ContactID
外键关系:FK_[从表名称]_[主表名称]_[外键列名称]。
示例:FK_StoreContact_Store_CustomerID

Date 和 Time 样式

如果 expression 为 date 或 time 数据类型,则 style
可感觉下表中展现的值之一。其余值作为 0 进行拍卖。SQL Server
使用科威特算法来支撑阿拉伯体制的日期格式。

1.用到Transact-SQL语言编制程序

固然SQL Server
2010提供了图形化界面,但独有一种Transact-SQL语言可以直接与数据库引擎进行互动。遵照实行作用特色能够将Transact-SQL语言分成3大类:数据定义语言DDL,数据操纵语言DML,数据调节语言DCL。

摘要 正文是参谋相关材质计算的一篇关于T-SQL语言编制程序标准的篇章,目的在于为急需那上面质感的IT集团统一希图开拓职员提供二个参阅。
来源:

1.3.10.    
用户定义数据类型
接纳帕斯Carl样式命名,命名格式为[自定义数据类型名称]。
示例:Flag
      NameStyle

赞助和音信

获取 SQL Server 2008 帮助

© 二零一零 Microsoft
Corporation。保留全部任务。 

3.1.BEGIN END语句块

BEGIN END能够定义SQL
Server语句块,使这个言辞作为一组语句试行,允许语句嵌套。比方请见示例4

附录B  参谋财富

3.19.  
TOP子句
在SQL Server
二〇〇五中增加了TOP的采纳,尽量使用TOP(变量)来减少SQL拼串现象。

语法

2.7.一元运算符

一元运算符只对一个表明式试行操作,该表达式能够是数字数据类型中的任何一种数据类型。SQL
Server 二〇一〇提供的一元运算符包涵正(+),负(-),位反(~)。
示例8:声圣元个int数据类型变量@num并赋值,对该变量做正负位反操作。
实施下列语句

DECLARE @num INT
SET @num=45
SELECT +@num AS 正,-@num AS 负,~@num AS 位反
GO

结果如图所示
金沙国际唯一官网网址 5

注:位反操作符用于取三个数的补数,只能用来整数。

3.9.语句换行

建议SQL代码每行以入眼字或“’”开头。

示例:

SELECT [ShiftID]

      ,[Name]

      ,[StartTime]

      ,[EndTime]

      ,[ModifiedDate]

  FROM [AdventureWorks].[HumanResources].[Shift]

在列名不切合Pascal样式时(开始的一段时代遗留系统),比如使用一切大写的列名称,或利用“_”进行连续的字段名称,参数名称定义使用
@ + [列名称],这里的列名称尽量符合帕斯Carl样式命名。

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 实例。

2.2.赋值运算符

即等号(=),将表明式的值赋予另二个变量。举二个简练的事例。
示例2:总计Student表中学生的平均入学成绩并打字与印刷。
Student表的数目如图所示,stu_enter_score列寄存了学员的入学成绩
金沙国际唯一官网网址 6
实践上边包车型客车口舌

DECLARE @average int--声明@average变量
SET @average=(--将计算出的平均值赋值给@average
SELECT AVG(stu_enter_score)
FROM Student)
PRINT @average--打印@average的值

结果如图所示
金沙国际唯一官网网址 7

附录A  命名法规

普及命名法规有多种样式:完全大写、完全小写、Pascal大小写和 Camel 大小写。

不独一非聚焦索引:PK_[表名称]_[列名称]。
示例:IX_Store_SalesPersonID

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)