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
其他:待续……

浙公网安备 33010602011771号