sqlserver存储过程的使用
参考网址:https://www.cnblogs.com/chaoa/articles/3894311.html(存储过程)
https://www.cnblogs.com/selene/p/4480328.html(游标)
--创建学生表
create table student1(
id int,
cardId int,
name varchar(32),
birthday datetime,
sex varchar(32)
) 1 1 王男 1996-08-27 09:00:00.000 男
2 2 杨幂 1995-04-20 06:00:00.000 女
3 3 程峰 1988-09-17 15:30:00.000 男
4 4 唐嫣 1895-05-27 14:30:28.000 女
5 5 王菲 1990-01-20 19:00:00.000 女
6 6 王忠磊 1980-08-08 08:09:00.000 男 --一、定义变量 参考:[https://www.cnblogs.com/chaoa/articles/3894311.html]
--简单赋值
declare @a int
set @a=5
print @a
--SELECT @a --使用select语句赋值
declare @user1 nvarchar(50)
select @user1='张三'
print @user1
declare @user2 nvarchar(50)
select @user2 = name from student1 where ID=1
print @user2 --使用update语句赋值
declare @user3 nvarchar(50)
update student1 set @user3 = name where ID=1
--print @user3
SELECT @user3 --二、表、临时表、表变量 --创建临时表1
create table #DU_User1 (
id int,
cardId int,
name varchar(32),
birthday datetime,
sex varchar(32)
); --向临时表1插入一条记录
insert into #DU_User1 (id, cardId, name, birthday, sex) values (11,11,'刘亦菲',GETDATE(),'女'); --从student1查询数据,填充至新生成的临时表(在插入数据的同时创建了临时表)
select * into #DU_User2 from student1 where ID<8 --查询并联合两临时表
select * from #DU_User2 where ID<3 union select * from #DU_User1 --删除两临时表
drop table #DU_User1
drop table #DU_User2 --创建临时表
CREATE TABLE #t(
id int,
cardId int,
name varchar(32),
birthday datetime,
sex varchar(32)
) --将查询结果集(多条数据)插入临时表
insert into #t select * from student1
--不能这样插入
--select * into #t from student1 --添加一列,为int型自增长子段
alter table #t add [myid] int NOT NULL IDENTITY(1,1)
--添加一列,默认填充全球唯一标识
alter table #t add [myid1] uniqueidentifier NOT NULL default(newid()) select * from #t
drop table #t --给查询结果集增加自增长列
--无主键时:
select IDENTITY(int,1,1)as ID, cardId, name, birthday, sex into #t from student1
select * from #t --有主键时:
select (select SUM(1) from student1 where ID<= a.ID) as myID,* from student1 a order by myID --定义表变量
declare @t table(
id int not null,
msg nvarchar(50) null
)
insert into @t values(1,'')
insert into @t values(2,'')
select * from @t --三、循环 --while循环计算1到100的和
declare @a int
declare @sum int
set @a=1
set @sum=0
while @a<=100
begin
set @sum+=@a
set @a+=1
end
print @sum --四、条件语句 --if,else条件分支
if(1+1=2)
begin
print '对'
end
else
begin
print '错'
end --when then条件分支
declare @today int
declare @week nvarchar(3)
set @today=3
set @week=case
when @today=1 then '星期一'
when @today=2 then '星期二'
when @today=3 then '星期三'
when @today=4 then '星期四'
when @today=5 then '星期五'
when @today=6 then '星期六'
when @today=7 then '星期日'
else '值错误'
end
print @week --五、游标 参考[https://www.cnblogs.com/selene/p/4480328.html]
--如果不指定游标的作用域,默认为global
(1) 使用游标给变量赋值(最标准)
declare @id int
declare @cardId int
declare @name varchar(50) --定义一个游标,并赋值
declare user_cur cursor for select id,cardId,name from student1
--打开游标
open user_cur --判断游标是否执行成功
fetch next from user_cur into @id,@cardId,@name
while @@fetch_status=0
begin
SELECT @id, @cardId, @name, @@fetch_status
--读取游标中的数据 fetch用来读取游标中的某一个行数据 next取下一行
fetch next from user_cur into @id,@cardId,@name
end
--关闭游标
close user_cur
--摧毁游标(释放游标)
deallocate user_cur eg1: 使用游标求和
ALTER PROCEDURE [dbo].[ss_1]
AS
BEGIN
DECLARE @zj int = 0;
DECLARE @name VARCHAR(100) = '';
DECLARE @sal int = 0; declare cur_js cursor for SELECT name, sal FROM student2
open cur_js
fetch cur_js into @name, @sal
while @@fetch_status=0
BEGIN
if @sal > 50
SET @zj = @sal + @zj
fetch cur_js into @name, @sal
END
close cur_js
deallocate cur_js
SELECT @name as '姓名', @zj AS '总工资'
END (2) 使用游标变量 --声明变量用DECLARE,为变量赋值可以用set或SELECT语句,对于游标变量的声明和赋值,
--其操作基本相同。在具体使用时,首先要创建一个游标,将其打开后,将游标的值赋给游
--标变量,并通过FETCH语句从游标变量中读取值,最后关闭释放游标。
eg:
--声明游标变量
declare @var_cur Cursor
--创建游标
declare user_cur cursor for select id,cardId,name from student1
--打开游标
open user_cur
--为游标变量赋值
set @var_cur = user_cur
--从游标变量中读取值
fetch next from @var_cur
--判断fetch语句是否执行成功
while @@fetch_status=0
begin
fetch next from @var_cur
end
--关闭游标
close user_cur
--释放游标
deallocate user_cur (3)用游标为变量赋值 --在游标的操作过程中,可以使用FETCH语句将数据值存入变量,
--这些保持表中列值的变量可以在后面的程序中使用
declare @id int
declare @ucardId int
declare @uname varchar(50) --定义一个游标,并赋值
declare user_cur cursor for select id,cardId,name from student1 WHERE id = 2
--打开游标
open user_cur --判断游标是否执行成功
fetch next from user_cur into @id,@ucardId,@uname
print 'id 学号 姓名'
while @@fetch_status=0
begin
print @uname
fetch next from user_cur into @id,@ucardId,@uname
end
--关闭游标
close user_cur
--摧毁游标(释放游标)
deallocate user_cur (4)用ORDER BY 子句改变游标中的执行顺序 游标是一个查询结果集,那么能不能对结果进行排序呢?答案是否定的。与基本的SELECT
语句中的排序方法相同,ORDER BY子句添加到查询中可以对游标查询的结果排序。
注意:只有出现在游标中的SELECT语句中的列才能作为ORDER BY 子句的排序列,而对与非
游标的SELECT语句中,表中任何列都可以作为ORDER BY 的排序列,即使该列没有出现在SELECT语句的查询结果列中.
--定义一个游标,并赋值
declare user_cur cursor for select id,cardId,name from student1 ORDER BY id DESC
--打开游标
open user_cur --判断游标是否执行成功
fetch next from user_cur
while @@fetch_status=0
begin
--读取游标中的数据 fetch用来读取游标中的某一个行数据 next取下一行
fetch next from user_cur
end
--关闭游标
close user_cur
--摧毁游标(释放游标)
deallocate user_cur (5)用游标修改数据
--修改id等于@sid处name字段的值
declare @id int
declare @sid int = 1 --定义一个游标,并赋值
declare user_cur cursor for select id from student1
--打开游标
open user_cur
--判断游标是否执行成功
fetch next from user_cur into @id
while @@fetch_status=0
begin
if @id = @sid
begin
--修改表中字段的值
update student1 set name = '王楠' where id = @sid
end
fetch next from user_cur into @id
end
--关闭游标
close user_cur
--摧毁游标(释放游标)
deallocate user_cur SELECT * FROM student1 (6)用游标删除数据 使用游标删除数据时,既可以删除游标结果集中的数据,也可以删除基本表中的数据.
declare @id int
declare @sid int = 1 --定义一个游标,并赋值
declare user_cur cursor for select id from student1
--打开游标
open user_cur --判断游标是否执行成功
fetch next from user_cur into @id
while @@fetch_status=0
begin
if @id = @sid
begin
--删除表中的值
delete from student1 where id = @sid
end
fetch next from user_cur into @id
end
--关闭游标
close user_cur
--摧毁游标(释放游标)
deallocate user_cur SELECT * FROM student1 --六、触发器 --触发器中的临时表:
--Inserted:存放进行insert和update 操作后的数据
--Deleted:存放进行delete 和update操作前的数据
--创建触发器
Create trigger User_OnUpdate
On student1
for Update
As
declare @msg nvarchar(50)
--@msg记录修改情况
select @msg = N'姓名从“' + Deleted.Name + N'”修改为“' + Inserted.Name + '”' from Inserted,Deleted
--插入日志表
insert into [LOG](MSG)values(@msg) --删除触发器
drop trigger User_OnUpdate --七、存储过程 --创建带output参数的存储过程
CREATE PROCEDURE PR_Sum
@a int,
@b int,
@sum int output
AS
BEGIN
set @sum=@a+@b
END --创建Return返回值存储过程
CREATE PROCEDURE PR_Sum2
@a int,
@b int
AS
BEGIN
Return @a+@b
END --执行存储过程获取output型返回值
declare @mysum int
execute PR_Sum 1,2,@mysum output
print @mysum --执行存储过程获取Return型返回值
declare @mysum2 int
execute @mysum2= PR_Sum2 1,2
print @mysum2 --八、自定义函数 函数的分类: 1)标量值函数 2)表值函数 a:内联表值函数 b:多语句表值函数 3)系统函数 --新建标量值函数
create function FUNC_Sum1
(
@a int,
@b int
)
returns int
as
begin
return @a+@b
end --新建内联表值函数
create function FUNC_UserTab_1
(
@myId int
)
returns table
as
return (select * from ST_User where ID<@myId) --新建多语句表值函数
create function FUNC_UserTab_2
(
@myId int
)
returns @t table
(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL
)
as
begin
insert into @t select * from ST_User where ID<@myId
return
end --调用表值函数
select * from dbo.FUNC_UserTab_1(15)
--调用标量值函数
declare @s int
set @s=dbo.FUNC_Sum1(100,50)
print @s --删除标量值函数
drop function FUNC_Sum1
谈谈自定义函数与存储过程的区别: 一、自定义函数: 1. 可以返回表变量 2. 限制颇多,包括 不能使用output参数; 不能用临时表; 函数内部的操作不能影响到外部环境; 不能通过select返回结果集; 不能update,delete,数据库表; 3. 必须return 一个标量值或表变量 自定义函数一般用在复用度高,功能简单单一,争对性强的地方。 二、存储过程 1. 不能返回表变量 2. 限制少,可以执行对数据库表的操作,可以返回数据集 3. 可以return一个标量值,也可以省略return 存储过程一般用在实现复杂的功能,数据操纵方面。
复制代码
sqlserver存储过程的使用的更多相关文章
- 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)
解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...
- Sqlserver 存储过程中结合事务的代码
Sqlserver 存储过程中结合事务的代码 --方式一 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ ...
- SqlServer存储过程学习笔记(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
- SQLServer 存储过程嵌套事务处理
原文:SQLServer 存储过程嵌套事务处理 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形. 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否 ...
- 创建并在项目中调用SQLSERVER存储过程的简单示例
使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用.创建存储过程 和数据表一样,在使用之前需要创建存储过程,它的简明语法是: 引用: Create PROC ...
- SQLSERVER存储过程语法详解
CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ...
- SqlServer存储过程详解
SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...
- sqlServer存储过程与sql语句的区别
sqlServer 存储过程与sql语句的区别 sql存储过程与sql语句的区别: 从以下几个方面考虑: 1.编写: 存储过程:编写比较难: sql语句:相对简单: 2.性能: 存储过程:高,可移 ...
- SqlServer存储过程(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
- SQLSERVER存储过程的基本语法实例
SQLSERVER存储过程的基本语法实例 SQLSERVER存储过程的基本语法实例 一.定义变量--简单赋值 declare @a intset @a=5 print @a --使用select语句赋 ...
随机推荐
- ESP8266 RTOS SDK烧写环境构建
简介 esptool是一个Python软件程序,适用于ESP8266等一系列芯片的烧写,灵活高效. 环境构建 在官网下载安装最新2.7版python (linux和os x一般会自带python2.7 ...
- js 获取鼠标的手势方向角度
需要获取鼠标的移动角度 1.mousedown 确定起始点 2.mousemove 确立相关点 3.先计算两点的斜率,然后根据三角函数和反三角函数.转换为角度 <!DOCTYPE html> ...
- Vim编辑器设置及其使用
一.vim编辑器的相关配置文件 /etc/vimrc:vim编辑器的全局配置文件,针对所有用户有效 /etc/virc:vi编辑器的全局配置文件,针对所有用户有效 ~/.vimrc:vim编辑器的其他 ...
- vs2017 .net core 项目调试浏览器网页闪退Bug
from:https://blog.csdn.net/qq_36330228/article/details/82152187 vs更新2017最新版本后,项目调试浏览器莫名其妙出现闪退,每次都TMD ...
- Seq2Seq ---学习笔记
应用场景:机器翻译 与language model 不同 MT model 的a<0> 是由encoder 生成的. language model 的 a<0> 是 初始化的. ...
- C#调用Microsoft.DirectX.DirectSound问题记录及解决
问题1:初始化结构体WaveFormat或其他变量时卡死 修改App.config,修改方法如下: 原App.config <?xml version="1.0" encod ...
- 博客系统(cnblog)
1.用户表:Userinfo 2.博客站点表:Blog 3.标签表:Tag 4.分类表:Category 5.文章表:Article 6.点赞踩表:ArticelUpDown 7.评论表:Commen ...
- jenkins构建任务后发送邮件
1.jenkins登录后-系统管理-系统设置打开后定位到下面的位置:系统管理员邮件地址一定要填写 2.下滑页面定位到extend E-mail Notification:这个是jenkins的一个插件 ...
- sql的优化
适当的索引 尽量不要有空判断的语句 尽量不要使用不等于条件 尽量不要使用or条件 尽量不要使用左右模糊查询 尽量使用exists代替in 尽量避免一次性返回大数据量
- bzoj 3597 [Scoi2014] 方伯伯运椰子 - 费用流 - 二分答案
题目传送门 传送门 题目大意 给定一个费用流,每条边有一个初始流量$c_i$和单位流量费用$d_i$,增加一条边的1单位的流量需要花费$b_i$的代价而减少一条边的1单位的流量需要花费$a_i$的代价 ...