存储过程:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。功能强大,限制少
如何调用存储过程
1 --无参数的存储过程 2 exec sp_databases; 3 4 --有参数的 5 exec sp_helpdb TestDataBase; 6 7 exec sp_renamedb TestDataBase, TDB; 8 -- 当参数较多的时候,建议使用显示赋值 9 exec sp_renamedb @newname='Testdatabase', @dbname='TDB';
创建,修改无参存储过程:
创建:
-- 一个无参的查询存储过程 /* create proc usp_存储过程名 as 查询步骤 */ go create proc usp_spFenYe as select * from dbo.fn_fenye(1,10);--一个分页的fn,获取第一页的数据,10条/页 go
修改已有的存储过程usp_Test,以实现转账为例子(开启事务),
1 alter proc usp_Test 2 as 3 begin 4 begin transaction 5 declare @myError int; 6 set @myError = 0; 7 update bank set balance=balance + 900 where cid='0001'; 8 set @myError += @@ERROR; 9 update bank set balance=balance - 900 where cid='0002'; 10 set @myError += @@ERROR; 11 if(@myError > 0) 12 begin 13 rollback transaction; 14 end 15 else 16 begin 17 commit transaction; 18 end 19 end; 20 go 21 22 select * from bank; 23 24 exec usp_Test;
建个有参数的存储过程,继续转账:
1 create proc usp_ZZ2 2 @from char(4), --从那里转 3 @to char(4), --转到哪里 4 @money money --金额 5 as 6 begin 7 begin transaction 8 declare @myError int; 9 set @myError = 0; 10 update bank set balance=balance - @money where cid=@from; 11 set @myError += @@ERROR; 12 update bank set balance=balance + @money where cid=@to; 13 set @myError += @@ERROR; 14 -- 什么时候提交,什么时候回滚? 15 if(@myError > 0) 16 begin 17 rollback transaction; 18 end 19 else 20 begin 21 commit transaction; 22 end 23 end 24 go 25 26 select * from bank; 27 28 exec usp_ZZ2 '0001', '0002', 90; 29 30 exec usp_ZZ2 @money=500, @from = '0001', @to = '0002'; 31 32 exec usp_ZZ2 '0001', '0002', 410; 33 34 go
依然在转账
1 create proc usp_ZZ3 2 @from char(4), 3 @to char(4), 4 @money money 5 as 6 begin 7 begin transaction 8 declare @last money; 9 set @last = (select balance from bank where cId=@from); 10 if(@last - 10 >= @money) 11 -- bank表里有一个检查约束,余额要大于等于10 12 begin 13 update bank set balance=balance - @money where cid=@from; 14 update bank set balance=balance + @money where cid=@to; 15 commit; 16 select '转账成功'; 17 end 18 else 19 begin 20 rollback; 21 select '转账失败'; 22 end 23 end 24 go 25 26 exec usp_ZZ3 '0001', '0002', 900; 27 28 select * from bank;
给存储过程的参数设置默认值,示例:
1 create proc usp_testDefault 2 @str nvarchar(50) = '默认值' 3 as 4 select @str; 5 6 exec usp_testDefault '我是传进来的参数啊';
output参数怎么用,还在转(转账),修改存储过程zz4;
1 -- 带有output参数的存储过程 2 3 go 4 5 create proc usp_ZZ4 6 @from char(4), 7 @to char(4), 8 @money money, 9 @state int output 10 -- 这个state表示需要在存储过程中赋值,外面使用的参数 11 as 12 begin 13 begin transaction 14 declare @last money; 15 set @last = (select balance from bank where cId=@from); 16 if(@last - 10 >= @money) 17 18 begin 19 update bank set balance=balance - @money where cid=@from; 20 update bank set balance=balance + @money where cid=@to; 21 commit; 22 set @state = 1;--1表示转账成功 23 end 24 else 25 begin 26 rollback; 27 set @state = 0;--转账失败 28 end 29 end 30 go 31 ---------------- 32 -- 使用 33 declare @State int; 34 exec usp_ZZ4 '0001', '0002', 1000, @State output; 35 exec usp_ZZ4 @from = '0001', @to = '0002', @money = -501, @state = @State output; 36 37 select @State;
分类:
SQLSERVER
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)