Sql Server中事务、存储过程详解

由于语言方向,所以接触最多的还是大微软的Sql Server数据库,使用数据库不可避免的会使用sql的一些高级语法,下面的语句是在平时编码中常用的技术,贴出来分享一下

事务:稍微上规模的软件都要求一定的严谨性,事务确实是一个不可或缺的技术点。

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。(注:网上摘抄)代码如下:

Student表为给出   这里仅用到id一个表项,其他的自拟

declare @errornum int
set @errornum=0
begin transaction
update Student set name='ewfeeeeeeeeeeeeeeeeeeeeeeeee' where id='1'
set @errornum=@errornum+@@ERROR

if(@errornum=0)
    begin 
    commit transaction
    end
else
begin
rollback transaction
print 'woaini'
end
select * from Student where id='1'


exec sp_databases
declare @Studnet int
set @Studnet=243
exec sp_helptext @Studnet


在学生管理系统中多次用到了视图

在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

代码:

CREATE VIEW [User](name,password,quxi)
    AS 
    select Student.StudentName,Student.PassWord,Student.QuXi from Student
    union
    select Teacher.TeacherName,Teacher.PassWord,Teacher.QuXi from Teacher
    union
    select Manager.ManagerName,Manager.PassWord,Manager.QuXi from Manager;

SELECT * FROM [User]

功能:将Student、Teacher、Manager三个表相同的表项抽象到User视图中

触发器:触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。

ALTER TRIGGER onUpdate
ON dbo.ViewElecCourse
INSTEAD OF UPDATE
AS

begin
declare @Cid varchar(10)
declare @Sid varchar(10)
declare @Score int

declare @CName varchar(20)
declare @SName varchar(20)

select @CName=C_Name from deleted
select @SName=S_Name from deleted

select @Score=E_Score from inserted

select @Sid=dbo.Student.S_Id from dbo.Student where 
dbo.Student.S_Name=@SName

select @Cid= dbo.Course.C_Id from  dbo.Course where 
 dbo.Course.C_Name =@CName

 update Elective set E_Score=@Score where 
 dbo.Elective.E_Sid=@Sid and dbo.Elective.E_Cid=@Cid;
 end

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ALTER TRIGGER onInsert
ON dbo.ViewElecCourse
INSTEAD OF  INSERT
AS
begin
declare @Cid varchar(10)
declare @Sid varchar(10)
declare @Score int

declare @CName varchar(20)
declare @SName varchar(20)

select @CName=C_Name from inserted
select @SName=S_Name from inserted
select @Score=E_Score from inserted

select @Sid=dbo.Student.S_Id from dbo.Student where 
dbo.Student.S_Name=@SName

select @Cid= dbo.Course.C_Id from  dbo.Course where 
 dbo.Course.C_Name =@CName

 insert into Elective values(@Cid,@Sid,@Score)
 end

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

ALTER TRIGGER onDelete
ON dbo.ViewElecCourse
INSTEAD OF  DELETE
AS
begin
declare @Cid varchar(10)
declare @Sid varchar(10)

declare @CName varchar(20)
declare @SName varchar(20)

select @SName=S_Name from deleted
select @CName=C_Name from deleted

select @Sid= dbo.Student.S_Id from  dbo.Student where 
 dbo.Student.S_Name =@SName

 select @Cid= dbo.Course.C_Id from  dbo.Course where 
 dbo.Course.C_Name =@CName

delete from Elective where E_Sid=@Sid and E_Cid=@Cid 
end

--触发器中的事务
alter trigger testdelete on Student
after delete 
as
begin
select * from Student
begin transaction 
rollback transaction
end


上次面试中,技术面试官提问了一个关于join的问题,由于没有认真看过sql,所以不是回答的不是太理想,哎,不说了,以下是练习代码:

select t.Brand,s.Id
from T_Customers as t join T_Seats as s on t.Id=s.Id

select t.Brand,s.Id
from T_Customers as t join T_Seats as s on t.Id=s.Id
where t.Age>(select AVG(age) from T_Customers)

//子查询
select * from T_Customers

select * from
(
    select * from T_Customers
)as s1

In的用法
select * from T_Customers
where Id in(1)

单列多行
select * from T_Customers
where id in
(
select BuyDate from T_Customers
)

分页相关的列
select ROW_NUMBER() over(order by Id DESC) AS rownum,
* from T_Customers

select * from
(select ROW_NUMBER() over(order by Id DESC) AS rownum,
* from T_Customers) as e1
where e1.rownum>1

其他:待续……

 

posted @ 2013-06-08 20:14  张国朋  阅读(413)  评论(0)    收藏  举报