sql存储过程语法详解

2023-05-16

一、定义变量

使用关键字declare申明变量:

declare @变量名 变量类型

/*简单赋值*/

 declare @a int
 set     @a=5
 print   @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
begin
  set @d+=1
  set @sum+=@d
end
print @sum

这里写图片描述

四、条件语句

if-else

if1+1=2begin
  printf("对"end
else
begin
  print("错"end

when -then

declare @today int
declare @week nvarchar(3)
set @week=case
set@today=1
   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

例子:导入前一天的数据

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_name
 ON 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
BEGIN
    insert 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
)')
end

END

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sql存储过程语法详解 的相关文章

  • 解决anaconda虚拟环境连接不上jupyter的kernel的方法(无法连接服务)

    jupyter日志 xff1a ImportError cannot import name AsyncGenerator 问题 xff1a 在anaconda中创建conda虚拟环境后安装ipykernel xff0c 在jupyter中
  • Tensorflow代码学习-8-3下载google图像识别网络inception-v3并查看结构

    下载google图像识别网络inception v3并查看结构 课程 xff1a 炼数成金GITHUBCSDN知乎欢迎点亮star span class token keyword import span tensorflow span c
  • Tensorflow代码学习-10-3验证码识别

    验证码识别 课程 xff1a 炼数成金GITHUBCSDN知乎欢迎点亮star span class token comment coding utf 8 span span class token keyword import span
  • 腾讯云ubuntu远程桌面

    1 首先要连接上你的服务器 xff0c 然后安装vncserver xff0c 这个是用来远程连接用的 命令如下 apt get install vnc4server 2 安装图形界面 apt get install xfce4如果安装不上
  • 如何快速上手期刊、会议论文latex的小技巧

    来自学习经验 xff0c 如有更好可评论告知 xff01 适用于各种期刊 会议的小技巧 xff01 xff01 可节省非常多时间 xff01 xff01 知乎专栏 简单描述如下 xff1a 1 找一篇与要投的期刊一篇论文 2 去arxiv网
  • 解决 树莓派自带的VNC版本不能进行文件传输

    在树莓派4B上使用的VNCSERVER是可以进行文件传输的 xff0c 就想应该是树莓派3B 43 上的操作系统自带的VNC版本太旧 xff0c 因此就想直接用命令sudo apt upgrade tightvncserver更新 xff0
  • Git submodule - Git子模块简介

    目录 建立仓库 1 1 创建主仓库 1 2 创建子仓库提交内容 2 1 提交到主工程的仓库 2 2 提交到子模块的仓库克隆带子模块的仓库到本地更新子仓库总结参考文档 正文 软件开发中有一个DRY Don t Repeat yourself
  • IR2101驱动

    下面是datasheet上的内部框图及应用电路 xff1a 由内部框图及输入输出时序图可知 xff1a HIN输入高则HO输出高 xff0c 输入低则输出低 低端也一样 由典型应用电路图分析 xff1a 当HIN LIN同时输入高 xff0
  • Cannot convert a symbolic Tensor to a numpy array错误的解决

    最近写代码的时候发生了一件奇怪的错误 NotImplementedError Cannot convert a symbolic Tensor bert encoder layer 0 attention self strided slic
  • ubuntu进入tty1、tty2等界面的操作

    想要进入tty1或者tty2 xff0c 需要ctrl 43 alt 43 f1 xff0c 注意如果是笔记本电脑 xff0c 需要输入ctrl 43 alt 43 fn 43 f1 xff0c 注意如果tty1界面进入不了的时候 xff0
  • 移植Mavlink协议到STM32F103详细教程

    环境配置 win10系统 43 STM32F103ZET6 步骤 参考MAVLINK官网 1 安装python3 6以上的版本 xff0c 我安装的是python3 8 Python3 8下载地址 详细安装步骤可参考 xff1a pytho
  • pid调试

    1 PID调试步骤 没有一种控制算法比PID 调节规律更有效 更方便的了 现在一些时髦点 的调节器基本源自PID 甚至可以这样说 xff1a PID 调节器是其它控制调节算法的吗 为什么PID应用如此广泛 又长久不衰 xff1f 因为PID
  • MAVLINK协议理解

    mavlink协议的载体是一下格式 xff1a 这是载体格式 这是载体的具体格式说明 mavlink的结构 主要有3部分 mavlink messages 比如 0 心跳包 这个message 就是各种数据帧里的数据 xff0c 例如 xf
  • 关于&0xFF的理解

    做协议解析时候 xff0c 一个byte的0xFE xff0c 直接转化int xff0c 应该是254 xff0c 但是最终结果是 2 xff0c 在网上一查 xff0c 有的人说是因为java用补码表示的byte 网址 xff1a ht
  • tensoflow2.x中tensor转numpy问题

    这里写自定义目录标题 AttributeError 39 Tensor 39 object has no attribute 39 numpy 39 AttributeError Tensor object has no attribute
  • A算法与A*算法区别

    A算法由 f n 61 g n 43 h n 俩个因素决定 xff0c g n 是这一步的代价函数 h n 是这一步的预估函数 xff1b 对于A 算法来说 xff0c 评判函数也是 f n 61 g n 43 h n 这个 xff0c 只
  • PARWAN处理器架构特点

    PARWAN处理器架构特点 PARWAN处理器结构图 xff08 搬运工系列 xff09 各个部分说明 xff1a Applied toCategtoriesSignal Name FunctionallyAC 累加计数器 Register
  • PX4源码学习一--Pix和APM的区别

    pixhawk是硬件平台 xff0c PX4是pixhawk的原生固件 xff0c 专门为pixhawk开发的 APM xff08 Ardupilot Mega xff09 也是硬件 Ardupilot是APM的固件 xff0c 所以称Ar
  • px4源码学习三--px4源码结构分析

    px4源码结构分析 Px4源码目录 cmake xff1a 是存放的 Cmake 编辑脚本文件夹 xff0c 其中 Cmake Configs 是存放的不同硬件的编译脚本 xff0c nuttx mindpx v2 default 是 PI
  • px4源码学习五--固定翼位置控制模块

    fw pos control模块 class landingslope 为固定翼着陆的角度变化模块 calulateSlopeValues void private 更新H1 H0 d1 根据log xff08 H0 H1 xff09 的比

随机推荐

  • px4源码学习六--uORB模块研究

    UORB模块研读 uORB函数解析 xff1a uORB模块 xff08 Micro Object Request Broker xff0c 微对象请求代理器 xff09 uORB是Pixhawk系统中关键的一个模块 xff0c 肩负了数据
  • Ubuntu开机进入busybox

    Ubuntu开机进入busybox 一般是因为ubuntu的文件系统出了问题 xff0c 所以需要在bushbox中进行扫描修复 看一下错误信息 xff0c 然后在busybox的命令行中运行fsck ext4 y dev sda1 xff
  • 关于JAVA文件都在没问题,没有错误提示波浪线,但编译时候提示找不到对应包的问题

    使用springboot做电商网站时候 修改了一点小功能 然后运行不了 提示XX XXX domain XX类找不到等一大堆类都找不到 但是对应包是存在的 而且在编辑框里没有红色的错误提示波浪线 所以 猜测应该不是代码的问题 又因为我们是g
  • c++泛型编程编译问题

    undefined reference to 模板类 c 43 43 泛型编程时候 xff0c 由于 h文件中放声明 xff0c cpp里放实现 xff0c main里调用 xff0c 编译时候 xff0c 就出现这样的问题 解决方法 xf
  • STM32CUBEMX的freertos一般使用方法笔记

    一 使用STM32CubeMX创建FreeRTOS操作系统 LED闪烁的配置 接下来配置时钟 xff0c 点击生成 此处为用户代码编写处 xff1b 开启这个选项便可以使用更加精确的延时 在代码区添加 便可以 xff01 二 任务挂起和取消
  • Qt5之QStatus状态栏

    1 一些常见用法 xff0c 来自其他优秀博文 xff1a https www cnblogs com toby zhang p 5729629 html 2 我这里添加状态了 xff0c 状态栏上放了一个QLabel控件显示时间 创建和添
  • 主函数一定要有while(1)吗?

    主函数一定要有while 1 吗 xff1f 在我两次移植例程时 xff0c 执行的结果都不对 xff0c 后来检查发现 xff0c 缺省了while 1 xff0c 加上之后结果就正确了 xff0c 这让我百思不得其解 xff0c 于是我
  • 解决error:legacy boot of uefi media

    错误 uefi媒体的传统引导 可能你的是GPT分区 xff0c 要改成UEFI引导 按F2 进入bios更换其他引导 xff0c 不同的品牌有自己进入的bios的方式 xff0c 我的是F2 按F10保存 解决
  • MongoDB安全实战之SSL协议加密

    邓开表同学实战MongoDB系列文章 xff0c 非常不错 xff0c 赞 xff01 大力推荐 xff01 本文主要讲述MongoDB的SSL协议加密的使用和配置的实战经验 xff0c 非常值得一看 前面系列文章 xff1a MongoD
  • 关于开源项目——C语言实现FTP服务器的结构解析

    项目地址 xff1a https github com beckysag ftp 针对此开源项目的说明 xff0c 结构分析 服务端整体框架 xff1a 1 从命令行输入得到服务端绑定端口号 2 设置套接口选项 xff0c 创建监听套接字
  • Nvidia Xavier NX 刷机 内置EMMC 带固态版

    Nvidia Xavier NX 刷机 内置EMMC 带固态版 前言一 烧录系统1 准备linux系统的电脑一台2 下载SDK Manager3 烧录过程 二 将NX系统迁移到NVME固态硬盘上1 格式化分区2 将EMMC SD卡的root
  • 关于vscode安装包下载太慢解决方法(详解)

    方法一 第一步 vscode官网选择下载版本 vscode官网 这里直接按系统选择合适的版本进行下载 xff01 第二步 进入下载界面 xff08 这一步别着急 xff0c 一定要进入下载过程 xff09 这里一定要点击保存 xff01 下
  • java 导出excel

    目录 一 动态下拉框二 合并行单元格三 复杂表头四 批量生成文件上传到文件服务器 xff0c 再从文件服务器批量下载压缩成压缩包后导出 一 动态下拉框 如何得到这样一张表格 xff1f 在单元格中插入可选下拉框 思路分析 xff1a exc
  • win10 H3C 映射外网端口,实现外网端口访问

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 cmd 进入 控制台 登录H3C命令行控制台 xff0c 输入账号密码 查看dns网卡等基本信息 进入系统视图 映射 查看映射情况
  • VMware Workstation v16.2 + CentOS6.5命令行模式

    VMware下载地址和安装教程 CentOS官网下载 文章目录 一 VMware部分1 新建虚拟机2 选择驱动3 配置网络 xff08 NAT配置 xff09 二 CentOs部分1 安装驱动2 联网补充 xff1a 一 VMware部分
  • 并发编程(一)cpu,进程,线程,并发

    文章目录 一 程序和进程1 程序的进化论2 程序和进程的关系3 进程和线程的关系4 CPU和RAM的关联5 CPU 进程 线程之间的关系6 CPU如何执行 二 线程1 线程的使用2 线程的生命周期 三 并发和并行1 并发和并行2 高并发的定
  • 并发编程(二)原子性和Synchronized同步锁

    文章目录 一 原子性1 什么是原子性2 造成原子性的原因3 解决原子性问题之Synchronized同步锁 二 Synchronized1 Synchronized的使用2 Synchronized的原理2 1 JVM的结构 2 2 类的加
  • 【异常】执行yum install lrzsz 报错

    报错信息如图 可以看出yum源出了问题 xff0c 配置yum源 按以下步骤执行 配置yum源 xff1a cd etc yum repos d mkdir bak mv repo bak vi iso repo span class hl
  • 【笔记】etc/profile和~/.bashrc的区别

    在搭建单节点的hadoop集群时 xff0c jdk的环境变量是在 bashrc 文件中配置的 而搭建三节点的hadoop集群时 xff0c 是在root用户下的 etc profile目录下配置的环境变量 两者有什么区别呢 xff1f e
  • sql存储过程语法详解

    一 定义变量 使用关键字declare申明变量 xff1a declare 64 变量名 变量类型 span class hljs comment 简单赋值 span declare span class hljs variable 64