as
declare@startRowint, @endRowint
set@startRow = (@pageIndex - 1) * @pageSize +1
set@endRow = @startRow + @pageSize -1
select*from(
select*, row_number()over(orderbyidasc)asnumberfromstudent
) t
wheret.numberbetween@startRowand@endRow;
execpro_stu 2, 2;
Ø Raiserror
Raiserror返回用户定义的错误信息,可以指定严重级别,设置系统变量记录所发生的错误。
语法如下:
Raiserror({msg_id | msg_str | @local_variable}
{, severity,state}
[,argument[,…n]]
[withoption[,…n]]
)
# msg_id:在sysmessages系统表中指定的用户定义错误信息
# msg_str:用户定义的信息,信息最大长度在2047个字符。
# severity:用户定义与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。
任何用户可以指定0-18直接的严重级别。只有sysadmin固定服务器角色常用或具有alter trace权限的用户才能指定19-25直接的严重级别。19-25之间的安全级别需要使用with log选项。
# state:介于1至127直接的任何整数。State默认值是1。
raiserror('is error', 16, 1);
select*fromsys.messages;
--使用sysmessages中定义的消息
raiserror(33003, 16, 1);
raiserror(33006, 16, 1);
为什么用事务?
举个例子,你给王汇100元钱,那系统会给你的卡上减掉100元,给王加100元,如果系统刚运行到给你减少了100元的时候停电了或者除了什么其他故障,而这100元又没有打到王的卡上,这怎么办呢?就要用刀数据库中的事务,事务要么事务中的语句全部执行,如果又失败就全部不执行,就是说要么你减掉100元给王加100元,2条语句都执行,要么你也不扣掉100元也不给王加,,通过rollback滚回到没有给你扣钱的时期,就是执行事务之前。
概念
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
特性
事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
实例
银行转账
利用存储过程来实现下面的应用:从一个账户转指定数额的款项到另一个账户中。*/
建表:
create
table account(accountnum int,uname char(10),total float)
insert
into account values(1001,'u1',50000)
insert
into account values(1002,'u2',1000)
select *
from account
建存储过程:
CREATE
PROCEDURE TRANSFER
@outAccount
int, @inAccount int, @amount FLOAT AS
DECLARE @totalDeposit FLOAT
BEGIN
TRANSACTION /*检查转出账户的余额*/ SELECT
@totalDeposit=total FROM ACCOUNT WHERE ACCOUNTNUM=@outAccount
IF
@totalDeposit IS NULL /*转出账户不存在或账户中没有存款*/
BEGIN
ROLLBACK
TRANSACTION
PRINT '转出账户不存在或账户中没有存款,不能操作!'
RETURN
END
IF
@totalDeposit<@amount /*转出账户存款不足*/
BEGIN
ROLLBACK
TRANSACTION
PRINT '转出账户存款不足,不能操作!' /* 建议使用函数RAISERROR('转出账户存款不足,不能操作!',10,1)
*/
RETURN
END
IF
exists(SELECT * FROM ACCOUNT WHERE ACCOUNTNUM=@inAccount ) /*检查转入账户是否存在*/
BEGIN
UPDATE
account SET total=total-@amount WHERE ACCOUNTNUM=@outAccount /*修改转出账户,减去转出额*/
UPDATE
account SET total=total+@amount WHERE ACCOUNTNUM=@inAccount /*修改转入账户,增加转出额*/
COMMIT
TRANSACTION /*提交转账事务*/
PRINT '转账成功,谢谢使用本存储过程!'
RETURN
END
ELSE
BEGIN
ROLLBACK
TRANSACTION
PRINT '转入账户不存在,不能操作!'
RETURN
END
执行存储过程:
exec
transfer 1001,1002,10000 /*将10000元从1001账户转入1002账户*/
exec
transfer 1001,1002,60000 exec transfer 1003,1001,1000
exec
transfer 1001,1004,10000