一、定义变量

使用关键字declare申明变量:

declare @变量名 变量类型

/*简单赋值*/declare @a intset     @a=5print   @a/*select赋值*/declare @b nvarchar(10)
select @b= stu_name from dbo.student where stu_id=6
print @b/*update赋值*/declare @c  nvarchar(10)
update dbo.student set @c=stu_name where stu_id=5
print @c

运行结果:

ps:使用set赋值时,等式右边不可以用函数表达式。

二、临时表、表变量

临时表:
临时表的创建是在Tempdb中,在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在。临时表在创建的时候都会产生SQL Server的系统日志。在Tempdb中体现,在内存中分配,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。

/*创建本地临时表#*/
create table #tablename()/*创建全局临时表##*/
create table ##tablename()
/*创建一个临时表#student*/
create table #student(id int,username nvarchar(20),sex nvarchar(2),age int
)/*向临时表中插入一条数据*/
insert into #student values(1,'Susan','女',18)/*从student表查询数据,填充至新生成的临时表*/
1.select * into #student2  from student where stu_age>30
2.insert into #student select * from student where stu_age>30

由于手误,执行了两次,表中出现了重复项,且每一列值都相同
怎么删除完全重复的项的呢?

delete T from
(select ROW_NUMBER() over(partition by username order by id) as rownumber,
* from #student)  T
WHERE T.rownumber>1

语法:ROW_NUMBER( ) OVER ( PARTITION BY 列1 ORDER BY 列2 )
根据COLUMN分组,在分组内部根据 COLUMN排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
函数“Row_Number”必须有 OVER 子句。OVER 子句必须有包含 ORDER BY

/*查询并联合两临时表*/
select * from #student where id >2 union select * from #student2
/*删除两临时表*/
drop table #student
drop table #student2
/*添加一列为int型自增长列*/
alter table #student add innerid int not null identity(1,1)

ps:identity(1,1)自增列,从1开始递增,每次加1

/*增加一列,默认填充全球唯一标识*/
alter table #student add myid uniqueidentifier not null default(newid())

表变量:
表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都是以“@@”为前缀,一般都是系统的全局变量。

declare @local_variable table()

declare @t table(id int not null,msg nvarchar(50) not null
)insert into @t values(1,'1')
insert into @t values(2,'2')
select * from @t

临时表与表变量的区别:

ps:
非聚集索引:数据行的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
聚集索引:与非聚集索引相反。
更多关于聚集索引与非聚集索引:
1.https://www.cnblogs.com/s-b-b/p/8334593.html
2.https://www.cnblogs.com/Jessy/p/3543063.html
更多关于表变量和临时表:
1.https://www.jb51.net/article/23952.htm
2.https://www.cnblogs.com/xinaixia/p/5821548.html

三、循环

while循环计算1到100的和:

declare @d int
declare @sum int
set @d=1
set @sum=0
while @d<100
beginset @d+=1set @sum+=@d
end
print @sum

四、条件语句

if-else

if(1+1=2)
beginprintf("对")
end
else
beginprint("错")
end

when -then

declare @today int
declare @week nvarchar(3)
set @week=case
set@today=1when @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 '错误值'
endprint @week

例子:导入前一天的数据

DECLARE @y varchar(4)
DECLARE @m varchar(2)
DECLARE @d varchar(2)select  @y=DateName(year,GetDate())
select  @d=DateName(day,dateadd(day,-1,GetDate())) if (DateName(day,GetDate())='1')/*如果当天是每月1号*/
select  @m=DateName(month,dateadd(MONTH,-1,GetDate()))/*月份-1*/
else
select  @m=DateName(month,GetDate())EXEC    [dbo].[InsertQYGPSData2]@year = @y,@month = @m,@day = @d

五、游标

1.定位到结果集中的某一行;
2.对当前位置的数据进行读写;
3.可以对结果集中的数据单独操作,而不是整行执行相同操作。
4.是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。

分类:
1.静态游标:不反应结果集中的所有更改
2.动态游标:反应结果集中所有更改
3.只进游标:不支持滚动,只支持从头到尾顺序提取数据
4.键集驱动游标:该游标中的各个成员顺序是固定的的,被标识的列做删改时,用户滚动游标是可见的,未标识则删改不可见。

游标的生命周期:
1.声明游标

declare cursor_name CURSOR [local | global][forward_only | scroll]
[static|keyset|dynamic|fast_forward]
[read_only|scroll_locks|optimistic]
[type_warning]
for select_statement
[for update[of column_name[,...n]]]

注释:

cursor_name:游标名称。
Local:作用域为局部,只在定义它的批处理,存储过程或触发器中有效。
Global:作用域为全局,由连接执行的任何存储过程或批处理中,都可以引用该游标。
[Local | Global]:默认为local。
Forward_Only:指定游标智能从第一行滚到最后一行。Fetch Next是唯一支持的提取选项。如果在指定Forward_Only是不指定Static、KeySet、Dynamic关键字,默认为Dynamic游标。如果Forward_Only和Scroll没有指定,Static、KeySet、Dynamic游标默认为Scroll,Fast_Forward默认为Forward_Only
Static:静态游标
KeySet:键集游标
Dynamic:动态游标,不支持Absolute提取选项
Fast_Forward:指定启用了性能优化的Forward_Only、Read_Only游标。如果指定啦Scroll或For_Update,就不能指定他啦。
Read_Only:不能通过游标对数据进行删改。
Scroll_Locks:将行读入游标是,锁定这些行,确保删除或更新一定会成功。如果指定啦Fast_Forward或Static,就不能指定他啦。
Optimistic:指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时,sqlserver不锁定行,它改用timestamp列值的比较结果来确定行读入游标后是否发生了修改,如果表不行timestamp列,它改用校验和值进行确定。如果已修改改行,则尝试进行的定位更新或删除将失败。如果指定啦Fast_Forward,则不能指定他。
Type_Warning:指定将游标从所请求的类型隐式转换为另一种类型时向客户端发送警告信息。
For Update[of column_name ,....] :定义游标中可更新的列。

2.声明一个动态游标:

declare OrderNum_cursor sursor scoll
for select OrderID from bigOrder where OrderNum='xxxx'

3.打开游标

open [Global] cursor_name | cursor_variable_name/*游标名             游标变量名*/

4.提取数据

Fetch
[ [Next|prior|Frist|Last|Absoute n|Relative n ]
from ]
[Global] cursor_name
[into @variable_name[,….]]

注释:

Frist:结果集的第一行
Prior:当前位置的上一行
Next:当前位置的下一行
Last:最后一行
Absoute n:从游标的第一行开始数,第n行。
Relative n:从当前位置数,第n行。
Into @variable_name[,...] : 将提取到的数据存放到变量variable_name中。


5.利用游标更新删除数据

/*①游标修改当前数据语法*/
Update 基表名 Set 列名=值[,...] Where Current of 游标名
/*②游标删除当前数据语法*/
Delete 基表名  Where Current of 游标名

6.关闭游标

/*关闭游标语法*/
close [ Global ] cursor_name | cursor_variable_name
/*关闭游标*/
close orderNum_03_cursor

7.删除游标

/*释放游标语法*/
deallocate  [ Global ] cursor_name | cursor_variable_name
/*释放游标*/
deallocate orderNum_03_cursor

六、触发器

原理,优点,作用参考:https://www.cnblogs.com/wangprince2017/p/7827091.html

分类:
1.DML:数据操纵语言
insert,delete,update触发器
2.DDl:数据定义语言
create,drop,alter触发器

语法:

CREATE TRIGGER trigger_nameON table_name[WITH ENCRYPTION]FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]AS T-SQL语句
GO
--with encryption 表示加密触发器定义的sql文本
--delete,insert,update指定触发器的类型
/*创建触发器 */
Create trigger User_OnUpdate  On ST_User  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

七、自定义函数

1.标量函数:返回的结果是一个标量
例:

2.内联表值函数:返回表数据,内联表函数返回的表结构由函数体内的SELECT语句来决定。
例:

create function FUN_Sum1
(@myid int
)
RETURNS table
AS
RETURN
(select * from St_user where ID<@myid
)
GO

3.多语句表值函数:已经定义好要返回的表中的字段

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
BEGINinsert into @t select * from ST_User where ID<@myId
RETURN
END
GO

4.调用表值函数

select * from dbo.FUNC_UserTab_1(15) 

5.调用标量函数

declare @s int
set @s=dbo.FUNC_Sum1(100,50)
print @s 

6.删除标量值函数

drop function FUNC_Sum1

尝试写了一个简单的存储过程:

USE [test]
GO
/****** Object:  StoredProcedure [dbo].[InsertQYGPSData2]    Script Date: 09/05/2018 15:51:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[InsertQYGPSData2]@year  varchar(4),@month varchar(2),@day   varchar(2)
AS
BEGIN
declare @tablename varchar(20)
set @day = right('00'+@day,2)
set @tablename='QYGPSData_'+@year+'_'+ @month+'_'+@day
IF  NOT EXISTS(SELECT NAME FROM sys.objects WHERE NAME=@tablename and TYPE='u')
begin
exec('create Table ' +@tablename+ ' ([Create_Date] [datetime] NULL,[CarNum] [varchar](50) NULL,[CarNo] [varchar](50) NULL,[FrontDoorUp] [int] NULL,[FrontDoorDown] [int] NULL,[BackDoorUp] [int] NULL,[BackDoorDown] [int] NULL,[lng] [varchar](50) NULL,[lat] [varchar](50) NULL,[State] [varchar](10) NULL,[CarPassenger] [int] NULL,[Line_Name] [varchar](100) NULL
)')
endEND

ps:语法:LEFT(ARG,LENGTH)、RIGHT(ARG,LENGTH)

LEFT、RIGHT函数返回ARG最左边、右边的LENGTH个字符串,ARG可以是CHAR或BINARY STRING。

sql存储过程语法详解相关推荐

  1. MySQL常用操作之创建存储过程语法详解

    MySQL常用操作之创建存储过程语法详解 前言 简介 语法 创建结构 变量结构 入参变量和出参变量 流程控制 判断(IF 语句) 判断(CASE 语句) 循环(LOOP 语句) 循环(WHILE 语句 ...

  2. SQLSERVER存储过程语法详解

    SQL SERVER存储过程语法: Create PROC [ EDURE ] procedure_name [ ; number ][ { @parameter data_type }[ VARYI ...

  3. 9.SQL存储过程实例详解

    本文用3个题目,从建立数据库到创建存储过程,详细讲解数据库的功能. 题目1 学校图书馆借书信息管理系统建立三个表: 学生信息表:student 字段名称 数据类型 说明 stuID char(10) ...

  4. SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

    系列文章目录 SQL全方位攻略:1.数据库介绍 SQL全方位攻略:2.SQL介绍 SQL全方位攻略:3.SQL标准 SQL全方位攻略:4. 标准SQL和SQL"方言" 文章目录 系 ...

  5. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  6. MySQL系列---架构与SQL执行流程详解

    文章目录 1. 背景 2. 架构体系 2.1 架构图 2.2 模块详解 2.3 架构分层 3. 查询SQL语句执行流程 3.1 连接 3.1.1 MySQL支持的通信协议 3.1.2 通信方式 3.2 ...

  7. Spring Data JPA 之 @Query 语法详解及其应用

    5 Spring Data JPA 之 @Query 语法详解及其应用 5.1 快速体验 @Query 的方法 沿⽤我们之前的例⼦,新增⼀个 @Query 的⽅法: // 通过 query 注解根据 ...

  8. Oracle创建表语句(Create table)语法详解及示例

    Oracle创建表语句(Create table)语法详解及示例   创建表(Create table)语法详解 1. ORACLE常用的字段类型ORACLE常用的字段类型有 VARCHAR2 (si ...

  9. php insert什么意思,PHP insert语法详解

    PHP insert语法详解 上次程序中有这么一句话: $exec="insert into info (ename,pcname) values ('".$_POST[" ...

最新文章

  1. 第四章 菜单、工具栏和状态栏(第8课)
  2. 搜索引擎优化 SEO
  3. 转载:身体器官工作表一览,睡觉别太晚了
  4. NTU 课程笔记 7454 GAN
  5. hibernate的3种继承映射关系总结——TPH,TPS,TPC
  6. Liferay Portal额外研究-银狐999
  7. 汉王云名片识别(SM)组件开发详解
  8. 计算机应用培训课程安排表,计算机培训教学计划
  9. python阈值计算_python – 在numpy中计算超过阈值的数组值的最快方法
  10. svn:Attempted to lock an already-locked dir
  11. 虚拟机安装BackTrack 5 的教程详解!
  12. c语言单片机题目设计大全,51单片机毕业设计题目.docx
  13. 使用计算机编辑文档的同时 还可播放mp3,win7系统电脑怎么使用Windows Movie Maker剪辑音频文件...
  14. Linux wipe工具
  15. 【优化求解】基于未来搜索算法FSA求解最优目标matlab代码
  16. 面试官问你有什么优点/缺点该如何回答
  17. 书写阿拉伯数字 0、1、2、3、4、5、6、7、8、9
  18. Dobot的一些理解
  19. 如何配置阿里Maven镜像
  20. 天呐!Linus两周搞出个Git,快来看看咋用滴!

热门文章

  1. java的三层架构是什么_java中的三层架构
  2. Python赋值运算符与赋值运算
  3. 【渝粤教育】电大中专消费者行为学作业 题库
  4. 江苏省高中计算机课程标准,江苏省普通高中课程设置
  5. oracle 字符串分割成数组_oracle 自定义字符串分割为数组方法
  6. 1.4_7 Axure RP 9 for mac 高保真原型图 - 案例6 【旋转的唱片4】进度条_拖拽、点击
  7. 基因序列比较 java实现
  8. 微信小程序scroll-view 实现锚点定位,滑动标题变化,点击标题变化
  9. 【无标题】中国电信5G技术大规模天线技术
  10. 仲裁庭怎样处理集体劳动人事争议