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语句. 数据查询语 ...
随机推荐
- BZOJ3775: 点和直线(计算几何+拉格朗日乘数法)
题面 传送门 题解 劲啊-- 没有和\(Claris\)一样推,用了类似于\(Shinbokuow\)推已知点求最短直线的方法,结果\(WA\)了好几个小时,拿\(Claris\)代码拍了几个小时都没 ...
- BZOJ 1002--[FJOI2007]轮状病毒(高精度)
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6858 Solved: 3745[Submit][Statu ...
- Android应用安全防护和逆向分析 ——apk反编译
概述 最近一直在学习Android应用安全相关和逆向分析的知识.现在移动app在安全方面是越来越重视了,特别是那些巨头企业涉及到钱的应用,那加密程度,简直是丧心病狂,密密麻麻.从这里可以看出,对于应用 ...
- RabbitMQ Java实例
引入RabbitMQ的jar包 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amq ...
- powerDesiner设计数据库的一些用法
数据库的设计主要有以下几个步骤: 1:需求分析:根据业务需求分析出满足客户的需求,从而建立相应的数据库 2:概念设计:通过数据抽象,设计系统概念模型,一般为E-R模型:(entity-relation ...
- java在编译期和运行期都做了什么
Java对象内存存储,引用传递,值传递详细图解 java对象在内存中的分配 编译过程: 编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?回答这个问题需要参照<编译原理>,总 ...
- 消息中间件(一)MQ详解及四大MQ比较
一.消息中间件相关知识 1.概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流 ...
- 【PKUSC2018】【loj6433】最大前缀和 状压dp
这题吼啊... 然而还是想了$2h$,写了$1h$. 我们发现一个性质:若一个序列$p$能作为前缀和,那么在序列$p$中,包含序列$p$最后一个数的所有子序列必然都是非负的. 那么,我们 令$f[i] ...
- 【BZOJ2300】【HAOI2011】防线修建
题目大意:给你m+3个点,有q个操作,每次要么询问当前点集构所构成的上凸壳总长度,要么在当前点集中删除一个点. 这题是吼题啊!!! 刚开始想着如何正常地做,考虑过用线段树维护一个区间内的凸包,发现并不 ...
- Intellij-插件安装-安装CodeGenerator插件并且添加Builder模板
Intellij IDEA 2018.1.2版本 CodeGenerator插件地址:https://github.com/lotabout/CodeGenerator/releases 步骤一:安装 ...