《SQL Server 2008从入门到精通》–20180716

1.锁

当多个客户相同的时间对同几个数量举行改革时会爆发并发难点,使用专门的职业就足以化解那些难点。不过为了防备别的顾客修正另一个还未做到的事务中的数据,就供给在业务中用到锁。
SQL Server
2010提供了四种锁格局:排他锁,分享锁,更新锁,意向锁,键范围锁,布局锁和大体积更新锁。
查询sys.dm_tran_locks视图能够高速理解SQL Server 二零零六内的加锁景况。

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

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语句不在同一个批管理中依然得以成功施行。

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

在语句第11中学平素注明了三个游标并赋值,而语句第22中学宣示了游标类型的变量@stu_cursor,然后给该变量赋值。那多头是区别的。

2.3.游标参数FOLANDWALX570D_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

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

3.仓库储存进度

仓库储存进程是后生可畏组用于完结一定成效的语句集,经过编译后存款和储蓄在数据库中。在SQL
Server 2009中,不只能用T-SQL编写存款和储蓄进程,也足以用CLEnclave编写存储进程。

3.1.客户定义的囤积进程

该种存款和储蓄进程是指封装了可接纳代码的模块大概经过,有2种档案的次序:T-SQL存储进程和CL奔驰G级存款和储蓄进度。
T-SQL存款和储蓄进程是指保存的T-SQL语句集结
CL奥迪Q5存款和储蓄进程是指对Microsoft .NET Framework公共语言启动时(CL陆风X8卡塔尔方法的援用

3.2.恢弘存款和储蓄进度

强盛存款和储蓄进度是指能够动态加载和运维的DLL,允许使用编程语言(如C语言卡塔尔创立本人的外界例程。扩充存款和储蓄进程平昔在SQL
Server 二〇一〇的实例的地方空间中运作,能够选择SQL
Server扩充存款和储蓄进度API实现编制程序。

3.3.种类存款和储蓄进度

系统存款和储蓄进度是指储存在源数据库中,以sp初阶的蕴藏进度,出以往各种系统定义数据库和客户定义数据库的sys布局中。

3.3.1.成立存款和储蓄进程法则

在思虑和创办存款和储蓄进度时,应该满意一定的自律和准绳。

  • CREATE
    PROCEDURE定义自己能够总结随机数量和花色的SQL语句,但下表中的语句除了这么些之外。不能够在仓库储存进度的任何任务运用那一个言辞。
  • 能够引用在集结存款和储蓄过程中开创的目的,只要援引时已开立了该目的
  • 能够在仓库储存进程内援引临时表
  • 后生可畏经在仓库储存进度中成立了本土有时表,该不时表仅为该存款和储蓄进度而存在,退出该存款和储蓄进度后,该有时表会消失
  • 设若推行的囤积过程调用了另四个积存进程,被调用的存款和储蓄进程能够访谈第多少个存款和储蓄进程的全数目的,包蕴一时表
  • 若是实施对长途SQL Server
    二零零六实例进行转移的长间隔存款和储蓄进度,这么些更动将不能够被回滚。远程存款和储蓄进度不到场事务管理
  • 存款和储蓄进程中的参数的最大数量为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

3.3.2.节制存款和储蓄进程内的称号

在储存进度内,如若用于语句的目的未有约束布局,则布局将暗中同意为该存款和储蓄进程的布局。要是创造该存款和储蓄进度的顾客并未有界定INSERT,SELECT,UPDATE或DELETE语句中引用的表名或试图名,则暗中认可情形下通过该存款和储蓄进度进展的访谈将遇到该过程创设者权限的限量。假设有别的客户要动用存款和储蓄进程,则怀有用于数据定义语言(DDL卡塔 尔(阿拉伯语:قطر‎的语句(如CREATE,ALTE奥迪Q7,EXECUTE,DROP,DBCC或动态SQL语句卡塔尔国的目的名应当用该指标布局的名号来约束。

3.3.3.加密存款和储蓄进度的概念

只要要创立存款和储蓄进度并确认保障别的客户无法查看该存款和储蓄进度的定义,则可以使用WITH
ENC奥迪Q5YPTION,那样,进程定义将以不足读的情势积存。

3.3.4.SET语句选项

当成立恐怕修正T-SQL存款和储蓄进程后,数据库引擎将保存SET
QUOTED_IDENTIFIER和SET
ANSI_NULLS的设置,实行存款和储蓄进度时将应用这个本来设置而忽略任何客户端会话的ET
QUOTED_IDENTIFIER和SET
ANSI_NULLS设置。其余SET选项在开创或改换存款和储蓄进程后不保留。

3.4.应用存储进程

3.4.1.创设存款和储蓄进程

示例3:将示例2用存款和储蓄进程实现
Student表的数量如图所示
图片 6
试行下列语句

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'

结果如图所示
图片 7

3.4.2.查看存款和储蓄进度

能够经过应用系统存款和储蓄进度或然目录视图查看存款和储蓄进度的概念

3.4.2.1.图形化分界面

如下图
图片 8

3.4.2.2.系统存款和储蓄进度sp_helptext查看存款和储蓄进度定义

推行下列语句

EXEC sp_helptext 'alter_data'

结果如图所示
图片 9

3.4.2.3.系统存款和储蓄进度sp_depends查看存款和储蓄进程有关新闻

实施下列语句

EXEC sp_depends 'alter_data'

结果如图所示
图片 10

3.4.2.4.目录视图查看存款和储蓄进程

实践下列语句

SELECT * FROM sys.procedures

结果如图所示
图片 11

3.4.3.改换存款和储蓄进度

ALTER
PROCEDURE
语句改正存款和储蓄进度,只需将下面示例中的CREATE改良成ALTEXC60运转就可以了。

3.4.4.去除存款和储蓄进度

进行下列语句删除存款和储蓄过程

DROP PROCEDURE alter_data

相关文章