SQL存储过程基础语法及实例
1、定义变量简单赋值
- declare @a int //声明一个变量a 赋初值为5
- set @a=
- print @a //输出变量a
- 2、创建临时表
- if OBJECT_ID('tempdb.#FlightState') is not null //如果存在先删除此表
- begin
- drop table #FlightState
- end
- CREATE TABLE #t //新建表
- (
- [ID] [int] NOT NULL,
- [Oid] [int] NOT NULL,
- [Login] [nvarchar]() NOT NULL,
- [Rtx] [nvarchar]() NOT NULL,
- [Name] [nvarchar]() NOT NULL,
- [Password] [nvarchar](max) NULL,
- [State] [nvarchar]() NOT NULL,
- )
- create table #FlightState(Calsign nvarchar(),[State] nvarchar(),ProcessTime datetime)
- 3、将查询结果集(多条数据)插入临时表
- insert into #t select * from ST_User
- insert into #FlightState (Calsign,[State],ProcessTime) select p.Calsign,p.StripState,p.ProcessTime from #Table p where FlightId=@beofreTomsFlightId
- select @beforeAtd=Atd,@beforeAta=Ata,@beforeCalsign=Calsign from #table where FlightId=@beforeFlightId
- insert into #FlightState (Calsign,[State],ProcessTime) values (@beforeCalsign,'',@beforeAtd)
- SELECT * FROM #FlightState
- 4、游标
- declare user_cur cursor for //定义游标
- open user_cur //打开游标
- while @@fetch_status=
- begin
- fetch next from user_cur into @ID,@Oid,@Login //读取下一条游标
- print @ID
- --print @Login
- end
- close user_cur
- deallocate user_cur //摧毁游标
- 5、实例
例1:把多表查询结果放入临时表
- USE [CDM]
- GO
- /****** Object: StoredProcedure [dbo].[p_GetFlightProcess] Script Date: 2018/4/27 14:32:01 ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- ALTER proc [dbo].[p_GetFlightProcess]
- @flightId int
- as
- begin
- declare @beforeFlightId int
- declare @beofreTomsFlightId int
- declare @tomsFlightId int
- declare @beforeAtd datetime
- declare @beforeAta datetime
- declare @beforeCalsign nvarchar()
- declare @lastCalsign nvarchar()
- declare @beforeState nvarchar()
- declare @beforeStateTime datetime
- declare @calsign nvarchar()
- declare @borktime datetime
- declare @pocktime datetime
- declare @EIBT datetime
- declare @EOBT datetime
- declare @understart datetime
- declare @underend datetime
- declare @boardstart datetime
- declare @boardend datetime
- --新建一个表如果已存在删除此表
- if OBJECT_ID('tempdb.#FlightState') is not null
- begin
- drop table #FlightState
- end
- create table #FlightState(Calsign nvarchar(),[State] nvarchar(),ProcessTime datetime)
- --查询数据并插入到临时表中
- select @beforeFlightId=BeforFlightId,@beofreTomsFlightId=BeforTomsFlightId,@tomsFlightId=TomsFlightId from [AKIS].[dbo].[ValidFlight] where FlightId=@flightId
- select @beforeAtd=Atd,@beforeAta=Ata,@beforeCalsign=Calsign from [AKIS].[dbo].[ValidFlight] where FlightId=@beforeFlightId
- insert into #FlightState (Calsign,[State],ProcessTime) values (@beforeCalsign,'前序起飞',@beforeAtd)
- insert into #FlightState (Calsign,[State],ProcessTime) values (@beforeCalsign,'前序落地',@beforeAta)
- --select @lastCalsign=Calsign,@beforeState=StripState,@beforeStateTime=ProcessTime from [CDM].[dbo].[StripStateChgLog] where FlightId=@beofreTomsFlightId
- --insert into #FlightState (Calsign,[State],ProcessTime) select p.Calsign,p.StripState,p.ProcessTime from [CDM].[dbo].[StripStateChgLog] p where FlightId=@beofreTomsFlightId
- select @understart=UnderStartTime,@underend=UnderEndTime,@EIBT=EIBT from [188.10.34.19].[DataBase].[dbo].[FlightStationTimeArrival] where AkisFlightId=@beforeFlightId
- insert into #FlightState (Calsign,[State],ProcessTime) values (@beforeCalsign,'上轮档',@EIBT)
- insert into #FlightState (Calsign,[State],ProcessTime) values (@beforeCalsign,'开始下客',@understart)
- insert into #FlightState (Calsign,[State],ProcessTime) values (@beforeCalsign,'下客结束',@underend)
- select @calsign=Calsign from [AKIS].[dbo].[ValidFlight] where FlightId=@flightId
- select @boardstart=BoardStartTime,@boardend=BoardEndTime,@borktime=BortTime,@pocktime=PockTime,@EOBT=EOBT from [188.10.34.19].[DataBase].[dbo].[FlightStationTime] where AkisFlightId=@flightId
- insert into #FlightState (Calsig n,[State],ProcessTime) values (@calsign,'开始登机',@borktime)
- insert into #FlightState (Calsign,[State],ProcessTime) values (@calsign,'开始上客',@boardstart)
- insert into #FlightState (Calsign,[State],ProcessTime) values (@calsign,'上客结束',@boardend)
- insert into #FlightState (Calsign,[State],ProcessTime) values (@calsign,'登机结束',@pocktime)
- insert into #FlightState (Calsign,[State],ProcessTime) values (@calsign,'撤轮档',@EOBT)
- --insert into #FlightState (Calsign,[State],ProcessTime) select p.Calsign,p.StripState,p.ProcessTime from [CDM].[dbo].[StripStateChgLog] p where FlightId=@TomsFlightId
- --print(@beforeFlightId)
- --print(@beofreTomsFlightId)
- --print(@tomsFlightId)
- SELECT * FROM #FlightState
- --SELECT @flightstate=(select FlightState from [188.10.34.19][DataBase].[dbo].[FlightStationTimeArrival] where FlighId = @flightId ),@borktime=ArrAddrName,@pocktime=Etd,@EIBT=Eta,
- end
例2:循环匹配更新数据
- USE [ZHCCdb]
- GO
- /****** Object: StoredProcedure [dbo].[P_FindFlightId] Script Date: 2018/4/27 14:14:38 ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- ALTER proc [dbo].[P_FindFlightId]
- @Calsign nvarchar(),
- @Depaddr nvarchar(),
- @Arraddr nvarchar(),
- @MsgType nvarchar(),
- --起飞报的时候传deptime,落地arrtime
- @time datetime,
- @isDate bit
- AS
- BEGIN
- declare @timeDiff int
- set @timeDiff=
- declare @rtimeDiff int
- declare @etd datetime
- declare @eta datetime
- declare @flightId int
- declare @indexFlightId int
- --定义一个游标查找FlightID
- declare cursor_FindFlight cursor for
- select top Etd,Eta,FlightId,Calsign from [188.10.34.13].[AKIS].[dbo].[ValidFlight] where Calsign=@Calsign and DepAddrName=@Depaddr and ArrAddrName=@Arraddr order by Etd Desc
- open cursor_FindFlight
- set @indexFlightId=
- fetch next from cursor_FindFlight into @etd,@eta,@flightId,@calsign
- while @@FETCH_STATUS=
- begin
- if(@MsgType='ARR')
- begin
- set @rtimeDiff = abs(datediff(MINUTE,@eta,@time))
- if @rtimeDiff < @timeDiff
- begin
- set @timeDiff = @rtimeDiff
- set @indexFlightId = @flightId
- end
- fetch next from cursor_FindFlight into @etd,@eta,@flightId,@calsign
- end
- else
- begin
- set @rtimeDiff = abs(datediff(MINUTE,@etd,@time))
- if @rtimeDiff < @timeDiff
- begin
- set @timeDiff = @rtimeDiff
- set @indexFlightId = @flightId
- end
- fetch next from cursor_FindFlight into @etd,@eta,@flightId,@calsign
- end
- end
- if @timeDiff >
- begin
- set @indexFlightId =
- end
- close cursor_FindFlight
- deallocate cursor_FindFlight
- --定义临时表用于存放需要返回的数据
- if OBJECT_ID('tempdb.#Table') is not null
- begin
- drop table #Table
- end
- create table #Table (MsgType nvarchar(),FlightId int,Calsign nvarchar(),DepTime datetime)
- --根据@indexFlightId更新数据库数据
- if @indexFlightId !=
- begin
- if @MsgType='FPL'
- begin
- update [188.10.34.13].[AKIS].[dbo].[ValidFlight] set EOBT=@time,FplTime=GETDATE(),FplFlag= where FlightId=@indexFlightId
- end
- if @MsgType='DEP'
- begin
- update [188.10.34.13].[AKIS].[dbo].[ValidFlight] set Atd=@time,DepCreateTime=GETDATE(),DepFlag= where FlightId=@indexFlightId
- end
- if @MsgType='ARR'
- begin
- update [188.10.34.13].[AKIS].[dbo].[ValidFlight] set Ata=@time,ArrCreateTime = GETDATE(),ArrFlag= where FlightId=@indexFlightId
- end
- if @MsgType='DLA'
- begin
- update [188.10.34.13].[AKIS].[dbo].[ValidFlight] set Eta=@time where FlightId=@indexFlightId
- end
- if @MsgType='CNL'
- begin
- update [188.10.34.13].[AKIS].[dbo].[ValidFlight] set EOBT=' ',FplFlag= where FlightId=@indexFlightId
- end
- --找到这条数据时放入临时表中
- insert into #Table (MsgType,FlightId,Calsign,DepTime) values (@MsgType,@indexFlightId,@Calsign,@time)
- end
- else
- begin
- if @isDate=
- if @MsgType='ARR'
- begin
- insert into [ZHCCdb].[dbo].[DelayMsg](MsgType,Calsign,Depaddr,Arraddr,ArrTime,CreateTime) values (@MsgType,@Calsign,@Depaddr,@Arraddr,@time,GETDATE())
- end
- else
- begin
- insert into [ZHCCdb].[dbo].[DelayMsg](MsgType,Calsign,Depaddr,Arraddr,DepTime,CreateTime) values (@MsgType,@Calsign,@Depaddr,@Arraddr,@time,GETDATE())
- end
- end
- select * from #Table
- END
例3:定义游标循环表中数据
- USE [ZHCCdb]
- GO
- /****** Object: StoredProcedure [dbo].[P_DelayMsg] Script Date: 2018/4/27 14:08:05 ******/
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- ALTER proc [dbo].[P_DelayMsg]
- as
- begin
- declare @MsgType nvarchar()
- declare @Calsign nvarchar()
- declare @Depaddr nvarchar()
- declare @Arraddr nvarchar()
- declare @Deptime datetime
- declare @ArrTime datetime
- declare @CreateTime datetime
- declare @DelayId int
- declare @flightId int
- if OBJECT_ID('tempdb.#DelayMsgTable') is not null
- begin
- drop table #DelayMsgTable
- end
- create table #DelayMsgTable (Id int,MsgType nvarchar(),Calsign nvarchar(),Depaddr nvarchar(),Arraddr nvarchar(),DepTime datetime,ArrTime datetime,CreateTime datetime)
- --insert into #DelayMsgTable select * from [ZHCCdb].[dbo].[DelayMsg] p where DATEDIFF(HOUR,CreateTime,getdate())< order by CreateTime DESC
- insert into #DelayMsgTable (Id,MsgType,Calsign,Depaddr,Arraddr,DepTime,ArrTime,CreateTime)
- select top p.Id,p.MsgType,p.Calsign,p.Depaddr,p.Arraddr,p.DepTime,p.ArrTime,p.CreateTime from [ZHCCdb].[dbo].[DelayMsg] p where DATEDIFF(HOUR,CreateTime,getdate())< order by CreateTime DESC
- --定义游标循环 #DelayMsgTable 数据
- declare cursor_DelayMsg cursor for
- select Id,MsgType,Calsign,Depaddr,Arraddr,Deptime,ArrTime,CreateTime from #DelayMsgTable
- open cursor_DelayMsg
- fetch next from cursor_DelayMsg into @DelayId,@MsgType,@Calsign,@Depaddr,@Arraddr,@Deptime,@ArrTime,@CreateTime
- while @@FETCH_STATUS=
- begin
- if @MsgType = 'ARR'
- begin
- exec [dbo].[P_FindFlightId] @Calsign,@Depaddr,@Arraddr,@MsgType,@ArrTime,'true'
- end
- else
- begin
- exec [dbo].[P_FindFlightId] @Calsign,@Depaddr,@Arraddr,@MsgType,@Deptime,'true'
- end
- fetch next from cursor_DelayMsg into @DelayId,@MsgType,@Calsign,@Depaddr,@Arraddr,@Deptime,@ArrTime,@CreateTime
- end
- close cursor_DelayMsg
- deallocate cursor_DelayMsg
delete from [ZHCCdb].[dbo].[DelayMsg] where DATEDIFF(HOUR,CreateTime,getdate())> 24
end
SQL存储过程基础语法及实例的更多相关文章
- Sql Server 基础语法
来自:http://www.cnblogs.com/AaronYang/archive/2012/04/24/2468093.html Sql Server 基础语法 -- 查看数据表 select ...
- Sql server 存储过程基础语法
一.定义变量 --简单赋值 declare @a int print @a --使用select语句赋值 declare @user1 nvarchar() select @user1='张三' pr ...
- SQL存储过程基础(从基础开始学,加油!)
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
- SQL - 2.基础语法
一.SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GR ...
- [SQL] SQL SERVER基础语法
Struct Query Language 1.3NF a.原子性 b.不能数据冗余 c.引用其他表的主键 2.约束 a.非空约束 b.主键约束 c.唯一约束 d.默认约束 e.检查约束 f.外键约束 ...
- SQL存储过程基础
什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...
- [SQL] Oracle基础语法
1.安装: oracle11g server 这里的口令为sys和system的密码.(10版本以前默认用户会有系统默认密码.) Oracle 11g 默认用户名和密码 oracle11g clien ...
- sql存储过程基本语法
一.定义变量 --简单赋值 declare @a int print @a --使用select语句赋值 declare @user1 nvarchar() select @user1='张三' pr ...
- SQL数据库基础语法
SQL语句的概述 SQL语言的分类 数据定义语言(Data Definition Language)主要用于修改.创建和删除数据库对象,其中包括CREATE ALTER DROP语句. 数据查询语 ...
随机推荐
- NetCore入门篇:(四)Net Core项目启动文件Startup
一.Startup介绍 1.Startup文件是Net Core应用程的启动程序,实现全局配置. 2.Net Core默认情况下,静态文件及Session都未启动,需要在Startup文件配置启动,否 ...
- 机器学习、深度学习、和AI算法可以在网络安全中做什么?
本文由 网易云发布. 本文作者:Alexander Polyakov,ERPScan的首席技术官和联合创始人.EAS-SEC总裁,SAP网络安全传播者. 现在已经出现了相当多的文章涉及机器学习及其保 ...
- pageadmin CMS网站制作教程:栏目单页内容如何修改
pageadmin CMS网站制作教程:栏目单页内容如何修改 一般情况下,如公司介绍,联系方式等介绍内页面都属于单页,单页内容可以直接在栏目设置界面进行修改,如下 1.对栏目单页内容进行设置,登录后台 ...
- nginx 场景业务汇总 (初)
本文链接:http://www.cnblogs.com/zhenghongxin/p/8891385.html 在下面的测试中,建议每次修改nginx配置文件后,都用此命令检查一下语法是否正确: [r ...
- docker存储volume
#环境 centos7. , Docker version -ce docker volume创建.备份.nfs存储 #docker volume 数据存容器内,删容器即销毁全部数据 要保留的数据(数 ...
- JavaScript基础流程控制(3)
day51 参考:https://www.cnblogs.com/liwenzhou/p/8004649.html for循环 while循环 三元运算 a>b条件成立,选a,不成立选b
- 基于SWOOLE的分布式SOCKET消息服务器架构
消息服务器使用socket,为避免服务器过载,单台只允许500个socket连接,当一台不够的时候,扩充消息服务器是必然,问题来了,如何让链接在不同消息服务器上的用户可以实现消息发送呢? 要实现消息互 ...
- Python中的运算符与表达式
你所编写的大多数语句(逻辑行)都包含了表达式(Expressions).一个表达式的简单例子便是 2+3.表达式可以拆分成运算符(Operators)与操作数(Operands).运算符(Operat ...
- 用 Python+nginx+django 打造在线家庭影院
用 Python+nginx+django 打造在线家庭影院 2018年11月29日 08:46:59 清如許 阅读数:1528 我喜欢看电影,尤其是好的电影,我会看上三四遍,仔细感受电影带给我的 ...
- day 42 mysql 数据库(2)
前情提要: 本节继续学习数据库 一:ddl 创建表 >字段名 >数据类型 >约束规则 >显示建表语句 修改表: 二:数据类型 >数值类型 >小数类型 >字 ...