局部变量
局部变量必须以@ 开头,而且必须先用DECLARE 命令说明后才可使用。
使用SELECT 或SET 命令来设定变量的值。
说明形式:
DECLARE @变量名 变量类型 [ @变量名 变量类型]
SELECT @局部变量 = 变量值
SET @局部变量= 变量值
例:
declare @name varchar(20) --声明变量
set @name = '奥迪%' --为变量赋值
declare @avg decimal(18,2)
set @avg=(select AVG(Price) from Car)
print '所有汽车的平均价格是:'+cast(@avg as varchar(20))
IF……ELSE……
IF <条件表达式>
<命令行或程序块>
[ELSE IF [条件表达式]
<命令行或程序块>]
BEGIN……END…… (相当于C#中的大括号{})
BEGIN
<命令行或程序块>
END
BEGIN…END 用来设定一个程序块,将在BEGIN…END 内的所有程序视为一个单元执行。BEGIN…END 经常在条件语句如IF…ELSE 中使用。
declare @find varchar(20) --声明变量
set @find='宝马' --变量赋值
if(@find='宝马') --判断
begin
print '宝马汽车' --显示结果如下第二图
select * from Car where Name like '%'+(@find)+'%'
end
else
begin
print '其他'
select * from Car
end
WAITFOR
WAITFOR 命令用来暂时停止程序执行,直到所设定的等待时间已过或所设定的时间已到才继续往下执行。
其中时间必须为DATETIME 类型的数据
WAITFOR {DELAY <‘时间’> | TIME <‘时间’>| ERROREXIT | PROCESSEXIT | MIRROREXIT}
DELAY 用来设定等待的时间最多可达24 小时
TIME 用来设定等待结束的时间点
ERROREXIT 直到处理非正常中断
PROCESSEXIT 直到处理正常或非正常中断
MIRROREXIT 直到镜像设备失败
例:
等待1 小时2 分零3 秒后才执行SELECT 语句
waitfor delay ’01:02:03’
select * from employee
等到晚上11 点零8 分后才执行SELECT 语句
waitfor time ’23:08:00’
select * from employee
创建存储过程
CREATE PROC[EDURE] procedure_name [ ; number ] --procedure可简写为proc,
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]
例:
create procedure UP_Fruit_Buy --为方便查看,创建存储过程名写为(用户_表_对表的操作)
@username varchar(50), --定义形参
@fruitname varchar(50),
@buycount int = 0
as
begin
……
end
当涉及到修改数据时,用begin tran …… rollback,便于操作失误时,恢复数据
触发器
触发器是一种特殊的存储过程。
触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性,另外还有强化约束和级联运行的功能。
inserted,deleted临时表
这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此不允许用户直接对其修改,是只读的。
这两个表的结构总是与被该触发器作用的表有相同的表结构。
这两个表是动态驻留在内存中的,当触发器工作完成,这两个表也被删除。
这两个表主要保存因用户操作而被影响到的原数据值或新数据值。
更新操作包括两个部分,在deleted中存放了旧值,然后在inserted中存放新值。
插入操作,在inserted中存放新值。
删除操作,在deleted中存放旧值。
种类:after触发器、instead of触发器
两种触发器的区别:after触发器是触发条件执行完以后,才执行触发器;instead of触发器是不再执行触发条件,直接执行触发器。
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{{ { FOR | AFTER | INSTEAD OF }
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ][ NOT FOR REPLICATION ]
AS
sql_statement [ ...n ]
}
例:
create trigger TR_Student_Delete on student --创建对于表student的触发器
for delete --触发条件
as
…… --执行过程
go