存储过程和事务
今天用一个小时帮别人写好了大作业里的存储过程(也称函数)和事务,记录一下遇到的问题:
- 若出现表名或属性名与关键字重复的情况(最好不要出现这种情况),应该在表名或属性名上加`…`,注意此处不是单引号,例如:`view`。
- 开启事务是start transaction,不是begin。
- 在存储过程声明参数或变量时,要先写变量名再写变量类型,例如:(IN id INT)或”DECLARE id INT;”。
- 如果在存储过程中有抛出错误的语句(DECLARE HANDLER CONTINUE FOR SQLEXCEPTION SET id=1;),那么赋值语句要写在它之后,放在它前面的话会报错。
关于触发器
做了当一个表删除时的触发器,怎么获取被删除的那条数据的信息呢,比如说ID?1 | declare @ID typeof ID; |
触发器中有两个特殊的表:inserted和deleted,可以从中获取被插入或删除行的信息。
还看见了一个奇怪的问题:
在Sql Server触发器中判断操作是Insert还是Update还是Delete?解答中用到了这两个表:
1 | DECLARE |
Deleted表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted表中。Deleted 表和触发器表通常没有相同的行。
Inserted表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted表和触发器表中。Inserted 表中的行是触发器表中新行的副本。
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)