您的位置:澳门新葡8455最新网站 > 数据库管理 > 2008从入门到精通

2008从入门到精通

发布时间:2019-10-05 16:07编辑:数据库管理浏览(161)

    1.锁

    当多个用户同时对同一个数据进行修改时会产生并发问题,使用事务就可以解决这个问题。但是为了防止其他用户修改另一个还没完成的事务中的数据,就需要在事务中用到锁。
    SQL Server 2008提供了多种锁模式:排他锁,共享锁,更新锁,意向锁,键范围锁,架构锁和大容量更新锁。
    查询sys.dm_tran_locks视图可以快速了解SQL Server 2008内的加锁情况。

    SELECT * FROM sys.dm_tran_locks;
    

    注:关于锁的知识书中没细讲,将在以后的博客中补充。

    目录

    2.游标

    游标是类似于C语言指针一样的结构,是一种数据访问机制,允许用户访问单独的数据行。游标主要由游标结果集和游标位置组成。游标结果集是定义游标的SELECT语句返回行的集合,游标位置是指向这个结果集中某一行的指针。
    示例1:用游标检索出student表中每行记录
    Student表记录如图所示
    澳门新葡萄京娱乐场 1
    执行下列语句

    USE test
    DECLARE stu_cursor CURSOR FOR
    SELECT * FROM student--声明student表的游标stu
    OPEN stu_cursor--打开游标
    FETCH NEXT FROM stu_cursor--移动该记录指针
    WHILE @@FETCH_STATUS=0--@@FETCH_STATUS用于保存FETCH操作的结束信息,=0表示有记录检索成功
    BEGIN
    FETCH NEXT FROM stu_cursor--游标指针移动到下一条记录
    END
    CLOSE stu_cursor--关闭游标
    DEALLOCATE stu_cursor--释放游标资源
    

    结果如图所示
    澳门新葡萄京娱乐场 2

    • 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.WAITFOR延迟语句
      • 3.6.RETURN无条件退出语句
      • 3.7.GOTO跳转语句
      • 3.8.TRY CATCH错误处理语句
    • 4.常用函数
      • 4.1.数据类型转换函数

    2.1.游标定义的参数LOCAL和GLOBAL

    游标定义参数LOCAL表示该游标只能作用于本次批处理或函数或存储过程。游标定义参数GLOBAL表示该游标可以作用于全局。
    执行下列语句

    DECLARE stu_cursor CURSOR LOCAL
    FOR SELECT * FROM student
    GO
    OPEN stu_cursor
    GO
    

    执行结果如下
    澳门新葡萄京娱乐场 3
    语句中,声明了一个student表的游标stu_cursor,在打开游标时提示游标不存在。因为该游标参数是LOCAL,只能作用于当前批处理语句中,而打开游标语句和声明语句不在一个批处理中。如果去掉第一个GO,使两个语句在同一个批处理中,就能顺利执行不会报错。
    执行下列语句

    DECLARE stu_cursor1 CURSOR GLOBAL
    FOR SELECT * FROM student
    GO
    OPEN stu_cursor1
    GO
    

    执行结果:命令已成功完成
    和LOCAL参数对比,GOLBAL参数设置游标作用于全局,因此OPEN和DECLARE语句不在同一个批处理中依然可以成功执行。

    1.使用Transact-SQL语言编程

    尽管SQL Server 2008提供了图形化界面,但只有一种Transact-SQL语言能够直接与数据库引擎进行交互。根据执行功能特点可以将Transact-SQL语言分成3大类:数据定义语言DDL,数据操纵语言DML,数据控制语言DCL。

    2.2.游标分为游标变量和游标类型

    如下列语句

    --语句1
    DECLARE stu_cursor CURSOR
    FOR SELECT * FROM student--声明student表的游标名称为stu_cursor并赋值
    GO
    
    --语句2
    DECLARE @stu_cursor CURSOR--声明游标类型的变量@stu_cursor
    SET @stu_cursor=CURSOR FOR--给该变量赋值
    SELECT * FROM student
    

    在语句1中直接声明了一个游标并赋值,而语句2中声明了游标类型的变量@stu_cursor,然后给该变量赋值。这两者是不同的。

    1.1.数据定义语言DDL

    是最基础的Transact-SQL语言类型,用来创建数据库和创建,修改,删除数据库中的各种对象,为其他语言的操作提供对象。例如数据库,表,触发器,存储过程,视图,函数,索引,类型及用户等都是数据库中的对象。常见的DDL语句包括

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

    2.3.游标参数FORWARD_ONLY和SCROLL

    FORWARD_ONLY参数设置游标只能从结果集的开始向结束方向读取,使用FETCH语句时只能用NEXT,而SCROLL参数设置游标可以从结果集的任意方向,任意位置移动。如下列语句

    --语句1,默认FORWARD_ONLY
    DECLARE stu_cursor CURSOR LOCAL
    FOR SELECT * FROM student
    OPEN stu_cursor
    FETCH NEXT FROM stu_cursor
    GO
    --语句2,FORWARD_ONLY参数,FETCH时只能从开始往结束方向
    DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
    FOR SELECT * FROM student
    OPEN stu_cursor 
    FETCH NEXT FROM stu_cursor
    GO
    --语句3,SCROLL参数,FETCH时可以从任意位置往任意方向
    DECLARE stu_cursor CURSOR SCROLL LOCAL
    FOR SELECT * FROM student
    OPEN stu_cursor
    FETCH LAST FROM stu_cursor
    GO
    

    1.2.数据操纵语言DML

    是用于操纵表和视图中的数据的语句,例如查询数据(SELECT),插入数据(INSERT),更新数据(UPDATE)和删除数据(DELETE)等。

    2.4.游标的简单应用

    示例2:将student表中stu_enter_score大于600分的学生都减去100分
    Student表中的数据如图所示
    澳门新葡萄京娱乐场 4
    执行下列语句

    --游标的简单应用
    DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
    FOR SELECT stu_no,stu_enter_score FROM student
    OPEN stu_cursor
    DECLARE @score INT
    DECLARE @stu_no VARCHAR(8)
    FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
    WHILE @@FETCH_STATUS=0 
    BEGIN
    IF @score>=600
    BEGIN
    UPDATE student
    SET stu_enter_score=@score-100 WHERE stu_no=@stu_no 
    END
    FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
    END
    CLOSE stu_cursor
    DEALLOCATE stu_cursor
    GO
    

    结果如图所示
    澳门新葡萄京娱乐场 5

    1.3.数据控制语言DCL

    涉及到权限管理的语言称为数据控制语言,主要用于执行有关安全管理的操作。如授予权限(GRANT),收回权限(REVOKE),拒绝授予主体权限,并防止主体通过组或角色成员继承权限(DENY

    3.存储过程

    存储过程是一组用于完成特定功能的语句集,经过编译后存储在数据库中。在SQL Server 2008中,既可以用T-SQL编写存储过程,也可以用CLR编写存储过程。

    1.4.Transact-SQL语言基础

    3.1.用户定义的存储过程

    该种存储过程是指封装了可重用代码的模块或者历程,有2种类型:T-SQL存储过程和CLR存储过程。
    T-SQL存储过程是指保存的T-SQL语句集合
    CLR存储过程是指对Microsoft .NET Framework公共语言运行时(CLR)方法的引用

    1.4.1.常量与变量

    常量不多说。在SQL Server 2008中,存在两种变量。一种是系统定义和维护的全局变量,一种是用户定义用来保存中间结果的局部变量。

    3.2.扩展存储过程

    扩展存储过程是指可以动态加载和运行的DLL,允许使用编程语言(如C语言)创建自己的外部例程。扩展存储过程直接在SQL Server 2008的实例的地址空间中运行,可以使用SQL Server扩展存储过程API完成编程。

    1.4.1.1.系统全局变量

    系统全局变量分为两大类,一类是与当然SQL Server连接或与当前处理有关的全局变量,如@@Rowcount表示最近一个语句影响的行数。@@error表示保存最近执行操作的错误状态。一类是与整个SQL Server系统有关的全局变量,如@@Version表示当前SQL Server的版本信息。

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

    结果如图所示
    澳门新葡萄京娱乐场 6

    3.3.系统存储过程

    系统存储过程是指存储在源数据库中,以sp开头的存储过程,出现在每个系统定义数据库和用户定义数据库的sys架构中。

    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
    

    结果如图所示
    澳门新葡萄京娱乐场 7

    3.3.1.创建存储过程规则

    在设计和创建存储过程时,应该满足一定的约束和规则。

    • CREATE PROCEDURE定义自身可以包括任意数量和类型的SQL语句,但下表中的语句除外。不能在存储过程的任何位置使用这些语句。
    • 可以引用在统一存储过程中创建的对象,只要引用时已创建了该对象
    • 可以在存储过程内引用临时表
    • 如果在存储过程中创建了本地临时表,该临时表仅为该存储过程而存在,退出该存储过程后,该临时表会消失
    • 如果执行的存储过程调用了另一个存储过程,被调用的存储过程可以访问第一个存储过程的所有对象,包括临时表
    • 如果执行对远程SQL Server 2008实例进行更改的远程存储过程,这些更改将不能被回滚。远程存储过程不参与事务处理
    • 存储过程中的参数的最大数量为2100
    • 存储过程中的局部变量的最大数量仅受可用内存的限制
    • 根据可用内存的不同,存储过程最大可达128MB
    语句 语句 语句
    CREATE AGGREGATE CREATE RULE CREATE DEFAULT
    CREATE SCHEMA CREATE(ALTER) FUNCTION CREATE(ALTER) TRIGGER
    CREATE(ALTER) PROCEDURE CREATE(ALTER) VIEW SET PARSEONLY
    SET SHOWPLAN_ALL SET SHOWPLAN_TEXT SET SHOWPLAN_XML
    USE database_name

    2.运算符

    3.3.2.限定存储过程内的名称

    在存储过程内,如果用于语句的对象没有限定架构,则架构将默认为该存储过程的架构。如果创建该存储过程的用户没有限定INSERT,SELECT,UPDATE或DELETE语句中引用的表名或试图名,则默认情况下通过该存储过程进行的访问将受到该过程创建者权限的限制。如果有其他用户要使用存储过程,则所有用于数据定义语言(DDL)的语句(如CREATE,ALTER,EXECUTE,DROP,DBCC或动态SQL语句)的对象名应该用该对象架构的名称来限定。

    2.1.算数运算符

    在SQL Server 2008中,算数运算包括加(+)减(-)乘(*)除(/)取模(%)。举一个简单的例子。
    示例1:在Student表中添加一列,列名为stu_age,根据Student表的stu_birthday列计算stu_age列并插入数据。(演示插入整列数据的方法)
    Student表数据如图所示
    澳门新葡萄京娱乐场 8
    执行下面的语句

    ALTER TABLE Student
    ADD stu_age int;--在Student表中添加stu_age列
    CREATE TABLE #agetemp(stu_no varchar(8),age int);--新建一个临时表
    INSERT INTO #agetemp(stu_no,age)--在临时表中插入学号和计算出来的年龄
    SELECT Student.stu_no,YEAR(GETDATE())-YEAR(stu_birthday)--利用函数和运算符计算年龄
    FROM Student;
    UPDATE Student
    SET Student.stu_age=#agetemp.age--将临时表中的age列数据整个复制到Student表的stu_age列
    FROM #agetemp
    WHERE Student.stu_no=#agetemp.stu_no--条件是两个表的stu_no列值相等
    GO
    SELECT * FROM Student
    

    结果如图所示
    澳门新葡萄京娱乐场 9

    3.3.3.加密存储过程的定义

    如果要创建存储过程并确保其他用户无法查看该存储过程的定义,则可以使用WITH ENCRYPTION,这样,过程定义将以不可读的形式存储。

    2.2.赋值运算符

    即等号(=),将表达式的值赋予另一个变量。举一个简单的例子。
    示例2:计算Student表中学生的平均入学成绩并打印。
    Student表的数据如图所示,stu_enter_score列存放了学生的入学成绩
    澳门新葡萄京娱乐场 10
    执行下面的语句

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

    结果如图所示
    澳门新葡萄京娱乐场 11

    3.3.4.SET语句选项

    当创建或者更改T-SQL存储过程后,数据库引擎将保存SET QUOTED_IDENTIFIER和SET ANSI_NULLS的设置,执行存储过程时将使用这些原始设置而忽略任何客户端会话的ET QUOTED_IDENTIFIER和SET ANSI_NULLS设置。其他SET选项在创建或更改存储过程后不保存。

    2.3.位运算符

    位运算符包括与运算(&),或运算(|)和异或运算(^),可以对两个表达式进行位操作,这两个表达式可以是整型数据或二进制数据。Transact-SQL首先把整型数据转换为二进制数据,然后按位运算。举个简单的例子。
    示例3:声明2个int型变量@num1,@num2,对这两个赋值且做与或异或运算。
    执行下面的语句

    DECLARE @num1 int,@num2 int
    SET @num1=5 
    SET @num2=6
    SELECT @num1&@num2 AS 与,
    @num1|@num2 AS 或,
    @num1^@num2 AS 异或
    

    结果如图所示
    澳门新葡萄京娱乐场 12
    扩展示例4:写一个十进制转换为二进制的函数

    CREATE FUNCTION Bin_con_dec(@dec int)--定义十进制转换为二进制函数
    RETURNS varchar(20)
    AS
    BEGIN
    DECLARE @quo int,@remainder varchar(20),@quo1 int
    SET @quo=@dec
    SET @remainder=''
    WHILE @quo<>0
    BEGIN
    SET @quo1=@quo/2
    SET @remainder=CAST(@quo%2 AS varchar(20))+@remainder
    SET @quo=@quo1
    END
    RETURN @remainder
    END
    

    执行上面的函数后,运行下列语句验证函数正确性

    PRINT dbo.Bin_con_dec(42)
    

    结果为101010,函数定义正确。

    3.4.使用存储过程

    2.4.比较运算符

    也称关系运算符,用于比较两个值的关系,常见的有等于(=),大于(>),小于(<),大于等于(>=),小于等于(<=),不等于(<>或!=)
    示例5:从Student表中查询入学成绩在平均分以上的学生信息
    Student表的数据如图所示
    澳门新葡萄京娱乐场 13
    执行下列语句

    DECLARE @ave int
    SET @ave=(SELECT AVG(stu_enter_score) FROM Student)
    SELECT *FROM Student
    WHERE stu_enter_score>=@ave;
    

    结果如下图所示
    澳门新葡萄京娱乐场 14

    注:不能直接把代码写成下面的形式

    SELECT * FROM Student
    WHERE stu_enter_score>=AVG(stu_enter_score)
    

    消息147,级别15,状态1,第2 行
    聚合不应出现在WHERE 子句中,除非该聚合位于HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。

    因为AVG是聚合函数。

    3.4.1.创建存储过程

    示例3:将示例2用存储过程实现
    Student表的数据如图所示
    澳门新葡萄京娱乐场 15
    执行下列语句

    CREATE PROCEDURE alter_data
    @a int--参数
    AS
    BEGIN
    DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
    FOR SELECT stu_no,stu_enter_score FROM student
    OPEN stu_cursor
    DECLARE @score INT
    DECLARE @stu_no VARCHAR(8)
    FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
    WHILE @@FETCH_STATUS=0 
    BEGIN
    IF @score>=@a
    BEGIN
    UPDATE student
    SET stu_enter_score=@score-100 WHERE stu_no=@stu_no 
    END
    FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
    END
    CLOSE stu_cursor
    DEALLOCATE stu_cursor
    END
    GO
    EXEC dbo.alter_data '600'
    

    结果如图所示
    澳门新葡萄京娱乐场 16

    2.5.逻辑运算符

    逻辑运算符的作用是对条件进行测试。ALL,AND,ANY,BETWEEN,EXISTS,IN,LIKE,NOT,ALL,SOME。下面用SOME来举例。SOME的作用是如果在一组比较中,有些为true那就为true。
    示例6:查询Student表中是否存在入学成绩高于平均分的学生,如果存在,输出true,不存在输出false。
    Student表的stu_enter_score列(入学成绩)数据如图所示
    澳门新葡萄京娱乐场 17
    执行下面的语句

    USE test
    IF (SELECT AVG(stu_enter_score) FROM Student)<=SOME(SELECT stu_enter_score FROM Student)
    PRINT 'true'
    ELSE
    PRINT 'false'
    GO
    

    结果如图所示
    澳门新葡萄京娱乐场 18

    3.4.2.查看存储过程

    可以通过使用系统存储过程或者目录视图查看存储过程的定义

    2.6.连接运算符

    加号(+)是字符串连接运算符,可以用它把字符串串连起来,在示例4的十进制转二进制函数中,就用上了加号。
    示例7:将Student表的stu_name列和stu_enter_score列放在同一列显示,列名为score
    Student表的数据如图所示
    澳门新葡萄京娱乐场 19
    执行下列语句

    SELECT stu_name+CAST(stu_enter_score AS VARCHAR(3)) AS score FROM Student
    

    执行结果如图所示
    澳门新葡萄京娱乐场 20

    注:stu_enter_score列数据类型为int,加号只对字符串类型数据有效,因此要用CAST函数将stu_enter_score的数据类型转换为varchar(3),这样才能实现字符串拼接。

    3.4.2.1.图形化界面

    如下图
    澳门新葡萄京娱乐场 21

    2.7.一元运算符

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

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

    结果如图所示
    澳门新葡萄京娱乐场 22

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

    3.4.2.2.系统存储过程sp_helptext查看存储过程定义

    执行下列语句

    EXEC sp_helptext 'alter_data'
    

    结果如图所示
    澳门新葡萄京娱乐场 23

    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
    

    结果如图所示
    澳门新葡萄京娱乐场 24
    计算代码中的表达式
    @result=@num+(~@num)4-@num/(~@num)
    =@num+(-46)
    4-@num/(-46)
    =45+(-46)4-45/(-46)
    =45+(-46)
    4
    =-139

    3.4.2.3.系统存储过程sp_depends查看存储过程相关信息

    执行下列语句

    EXEC sp_depends 'alter_data'
    

    结果如图所示
    澳门新葡萄京娱乐场 25

    3.控制语句

    3.4.2.4.目录视图查看存储过程

    执行下列语句

    SELECT * FROM sys.procedures
    

    结果如图所示
    澳门新葡萄京娱乐场 26

    3.1.BEGIN END语句块

    澳门新葡萄京娱乐场,BEGIN END可以定义SQL Server语句块,使这些语句作为一组语句执行,允许语句嵌套。举例请见示例4

    3.4.3.修改存储过程

    ALTER PROCEDURE语句修改存储过程,只需将上面示例中的CREATE修改成ALTER运行就行了。

    3.2.IF ELSE语句块

    用于指定T-SQL语句的执行条件,若条件为真,则执行条件表达式后面的语句,条件为假时,可以试用ELSE关键字指定要执行的T-SQL语句。举例请见示例4

    3.4.4.删除存储过程

    执行下列语句删除存储过程

    DROP PROCEDURE alter_data
    

    3.3.CASE分支语句

    示例10:将Student表的学生,性别和籍贯打印出来,要求籍贯只能显示省内,省外或自治区。
    Student表的数据如图所示
    澳门新葡萄京娱乐场 27
    执行下列语句

    SELECT stu_name AS 姓名,stu_sex AS 性别,
    (CASE stu_native_place
    WHEN '浙江' THEN '省内'
    WHEN '内蒙古' THEN '自治区'
    WHEN '西藏' THEN '自治区'
    WHEN '宁夏' THEN '自治区'
    WHEN '新疆' THEN '自治区'
    WHEN '广西' THEN '自治区'
    ELSE '省外'
    END) AS 籍贯 
    FROM Student
    

    结果如图所示
    澳门新葡萄京娱乐场 28

    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
    

    结果如图所示
    澳门新葡萄京娱乐场 29

    3.5.WAITFOR延迟语句

    WAITFOR延迟语句可以让在它之后的语句在一个指定的时刻或是时间间隔后执行,可以悬挂起批处理,存储过程或事务的执行。
    示例12:在某个时间点查询Student表学号为20180101的学生信息

    BEGIN
    WAITFOR TIME '15:03'--在15点03分查询
    SELECT * FROM Student
    WHERE stu_no='20180101'
    END
    

    示例13:在3分钟后查询Student表学号为20180102的学生信息

    BEGIN
    WAITFOR DELAY '00:03'--在3分钟后查询
    SELECT * FROM Student
    WHERE stu_no='20180102'
    END
    

    澳门新葡萄京娱乐场 30

    3.6.RETURN无条件退出语句

    该语句表示无条件终止查询,批处理或存储过程的执行。存储过程和批处理RETURN语句后面的语句都不再执行。当在存储过程中使用该语句时,可以指定返回给调用应用程序、批处理或过程的整数值。如果RETURN未指定返回值,则存储过程的返回值是0

    3.7.GOTO跳转语句

    该语句使T-SQL批处理的执行跳转至指定标签。由于该语句破坏结构化语句的结构,尽量少用
    示例13:将GOTO作为分支机制
    执行下面语句

    DECLARE @Counter int;  
    SET @Counter = 1;  
    WHILE @Counter < 10  
    BEGIN   
        SELECT @Counter  
        SET @Counter = @Counter + 1  
        IF @Counter = 4 GOTO Branch_One --Jumps to the first branch.  
        IF @Counter = 5 GOTO Branch_Two  --This will never execute.  
    END  
    Branch_One:  
        SELECT 'Jumping To Branch One.'  
        GOTO Branch_Three; --This will prevent Branch_Two from executing.  
    Branch_Two:  
        SELECT 'Jumping To Branch Two.'  
    Branch_Three:  
    SELECT 'Jumping To Branch Three.';
    

    结果如图所示
    澳门新葡萄京娱乐场 31
    当Counter=4时,执行GOTO语句输出Branch One,执行完这个语句之后就打破了WHILE循环,接着执行Branch_One语句中的GOTO,输出Branch Three,结束。

    注:在WHILE循环中使用GOTO会打破循环。

    示例14:用GOTO语句实现示例11中打印菱形的功能
    执行下列语句

    DECLARE @width int,@j int,@i int
    SET @width=9--@width为菱形的最大宽度
    SET @j=1--@j表示每行打印的“*”符号的个数
    SET @i=1--@i表示下一行打印第i行
    Set3:PRINT SPACE((@width-@j)/2)+REPLICATE('*',@j)--SPACE函数打印n个空字符,REPLICATE打印n个特定字符串
    SET @i=@i+1
    IF @i<=(@width+1)/2
    GOTO Set1
    ELSE
    GOTO Set2
    Set1:
    SET @j=@j+2
    GOTO Set3
    Set2:
    SET @j=@j-2
    IF @j>=1
    GOTO Set3
    

    结果如图所示
    澳门新葡萄京娱乐场 32

    3.8.TRY CATCH错误处理语句

    如果TRY块内部发生错误,会将控制传递给CATCH块内的语句组。TRY CATCH构造捕捉所有严重级别大于10但不会终止数据库连接的错误。
    示例15:TRY CATCH的示例
    执行下列语句

    BEGIN TRY
    SELECT * FROM Student
    SELECT 120/0 FROM Student
    END TRY
    BEGIN CATCH
    SELECT ERROR_MESSAGE() AS '错误信息'
    END CATCH
    

    执行结果如图所示
    澳门新葡萄京娱乐场 33
    语句中3个select语句全部都执行了。如果把报错的select语句放到正常的select语句前面,正常的select语句还能不能执行呢?执行下列语句

    BEGIN TRY
    SELECT 120/0 FROM Student
    SELECT * FROM Student
    END TRY
    BEGIN CATCH
    SELECT ERROR_MESSAGE() AS '错误信息'
    END CATCH
    

    结果如图所示
    澳门新葡萄京娱乐场 34
    正常select语句无法执行。TRY CATCH语句的逻辑是,一旦TRY语句块中出现问题语句,立刻跳转到CATCH语句块,TRY语句块接下去的语句不再执行。

    4.常用函数

    4.1.数据类型转换函数

    默认情况下SQL Server会对一些数据类型进行自动转换,这种转换称为隐式转换。遇到无法自动转换,则需要用CAST()函数和CONVERT()函数转换,这种转换称为显式转换。CAST()函数和CONVERT()函数的功能是相同的,CAST函数更容易使用,CONVERT函数的优点是可以指定日期和数值格式。
    示例16:将Student表中的学号转换为日期格式
    下面两句语句的功能是一样的,执行下列语句

    SELECT stu_name,CAST(stu_no AS DATE) AS 学号转换成日期,stu_enter_score,stu_birthday FROM Student
    SELECT stu_name,CONVERT(DATE,stu_no) AS 学号转换成日期,stu_enter_score,stu_birthday FROM Student
    

    结果如图所示
    澳门新葡萄京娱乐场 35
    示例17:用CONVERT()函数将stu_birthday转化成指定格式的日期
    执行下列语句

    SELECT stu_name,CONVERT(VARCHAR(20),stu_birthday,101) FROM Student
    --CONVERT函数将DATE类型的stu_birthday字段转化为字符串,并限定了样式,代码101
    

    结果如图所示
    澳门新葡萄京娱乐场 36

    注:在上述代码中,CONVERT(DATE,stu_birthday,101)这么写是没用的。101格式码只对日期格式转化为字符串有效,其他格式转化为日期格式是无效的。

    其他常用函数太简单了这边不写了,略。

    本文由澳门新葡8455最新网站发布于数据库管理,转载请注明出处:2008从入门到精通

    关键词: