Sql Server 存储过程及游标

SQL Server 数据库中存储过程(PROCEDURE)的使用方法 通过合理设计和使用存储过程,可以简化复杂的数据库操作,增强代码的可维护性,并提升应用程序的整体性能。在这个示例中,我们创建了一个名为 GetEmployeeDetails 的存储过程,它接受一个 @EmployeeID 参数,并返回与该 EmployeeID 对应的员工信息。在这个示例中,存储过程 GetEmployeeName 接受一个 @EmployeeID 输入参数,并返回一个 @EmployeeName 输出参数,该参数包含员工的完整姓名。性能监控:定期监控存储过程的性能,确保其执行效率。 阅读详情

Sql-Server

存储过程

  • 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行
  • 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
  • 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

存储过程案例

  • 创建数据库

    create schema test;  -- 创建schema
    create table test.Student(
    	sid int IDENTITY(1,1) PRIMARY KEY NOT NULL,
    	sname nchar(10),
    	age int,
    	sex char(2)
    );
    
  • 插入数据

    insert into test.Student(sname,age,sex) values(N'赵日天',18,'M'),(N'龙傲天',19,'M');
    
  • 系统自带proc

    exec sp_databases; --查看数据库
    exec sp_tables;        --查看表
    exec sp_columns Student;--查看列
    exec sp_helpIndex Student;--查看索引
    exec sp_helpdb;--数据库帮助,查询数据库信息
    select * from sys.objects --查询所有存储过程
    
  • 创建proc语法

    create proc | procedure pro_name
        [{@参数数据类型} [=默认值] [output],
         {@参数数据类型} [=默认值] [output],
         ....
        ]
    as
        SQL_statements
    
  • 不同案列展示

    -- 无参procdure 创建
    create proc slt_pro
    as
    	select top(1) * from test.Student;
    exec slt_pro;
    go
    
    -- 带参proc 创建
    if (object_id('slt_pro_name', 'P') is not null)
        drop proc slt_pro_name
    go
    create proc slt_pro_name(@sname nchar(10))
    as 
    	print '%'+ LTrim(RTrim(@sname))+'%'
    	select top(2) * from test.Student where sname like '%'+ LTrim(RTrim(@sname))+'%';
    exec slt_pro_name N'天' ;
    
    
    -- 带通配符参数存储过程
    if (object_id('slt_pro_name_tpf', 'P') is not null)
        drop proc slt_pro_name_tpf
    go
    create proc slt_pro_name_tpf(@sname nchar(10) = N'%天%', @nextName nchar(10) = N'%龙%')
    as
        select * from student where name like @name or name like @nextName;
    go
    
    exec slt_pro_name_tpf;
    exec slt_pro_name_tpf '%o%', '%t%';
    
    
    -- 带输出参数存储过程
    if (object_id('slt_ipt_opt','P') is not null)
    	drop proc slt_ipt_opt
    go
    create proc slt_ipt_opt(
    	@id int,-- 默认输入参数
    	@sname nchar(10) out,-- 输出参数
    	@age int output -- 输入输出参数??
    )
    as
    	select @sname = sname, @age = age from test.Student where sid = @id and age = @age;
    go
    
    declare @id int,
    		@sname nchar(10),
    		@age int;
    set @id = 1;
    set @age = 18;
    exec slt_ipt_opt @id,@sname out,@age output;
    select @sname,@age;
    print @sname 
    print @age 
    
    -- WITH RECOMPILE 不缓存
    /*
    通常看到存储过程发生重编译有几种原因,少数的重编译未必是坏事
    某表中数据的更改,由于数据的实时性,先前的执行计划效率将会降低,必然需要重编译;
    另外一种情况是手动执行sp_recompile存储过程来强制存储过程的重编译,或者以WITH RECOMPILE选项来执行存储过程。
    */
    -- WITH ENCRYPTION  用于加密存储过程的文本
    if (object_id('slt_encryption', 'P') is not null)
        drop proc slt_encryption
    go
    create proc slt_encryption
    with encryption
    as
        select top(1) * from test.Student;
    go
    exec slt_encryption;
    exec sp_helptext 'slt_encryption'; -- 加密无法访问
    exec sp_helptext 'slt_ipt_opt';  --可以明文显示出proc的代码
    
    
    -- 带游标参数存储过程
    if (object_id('slt_cursor', 'P') is not null)
        drop proc slt_cursor
    go
    create proc slt_cursor
    	@cur cursor varying output
    as
    	set @cur = cursor forward_only static for
    	select [sid],sname,age from test.Student;
    	open @cur;
    go
    -- 调用
    declare @exec_cur cursor;
    declare @sid int,
            @sname nchar(10),
            @age int;
    exec slt_cursor @cur = @exec_cur output;--调用存储过程
    fetch next from @exec_cur into @sid, @sname, @age;
    while (@@fetch_status = 0)
    begin
        fetch next from @exec_cur into @sid, @sname, @age;
        print 'id: ' + convert(varchar, @sid) + ', name: ' + LTRIM(RTRIM(@sname)) + ', age: ' + convert(char, @age);
    end
    close @exec_cur;
    deallocate @exec_cur;--删除游标
    
    
    --  分页存储过程 row_number完成分页
    if (object_id('slt_page', 'P') is not null)
        drop proc slt_page
    go
    create proc slt_page
    	@startIndex int,
    	@endIndex int
    as 
    	select count(*) as row_count from test.Student;
    	select * from (
    		select row_number() over(order by sid) as rowId, * from test.Student
    	)temp
    	where temp.rowId between @startIndex and @endIndex
    go
    
    exec slt_page 1, 2
    
    if (object_id('pro_page', 'P') is not null)
        drop proc pro_page
    go
    create procedure pro_page(
        @pageIndex int,
        @pageSize int
    )
    as
        declare @startRow int, @endRow int
        set @startRow = (@pageIndex - 1) * @pageSize +1
        set @endRow = @startRow + @pageSize -1
        select * from (
            select *, row_number() over (order by [sid] asc) as number from test.Student 
        ) t
        where t.number between @startRow and @endRow;
    
    exec pro_page 3, 2; -- 第几页,页面数据条数
    

游标

  • 游标是SQL Server的一种数据访问机制,它允许用户访问单独的数据行。用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成的SQL代码并立即执行或输出。

  • 游标是一种处理数据的方法,主要用于存储过程,触发器和 T_SQL脚本中,它们使结果集的内容可用于其它T_SQL语句。在查看或处理结果集中向前或向后浏览数据的功能。类似与C语言中的指针,它可以指向结果集中的任意位置,当要对结果集进行逐条单独处理时,必须声明一个指向该结果集中的游标变量。

  • SELECT 语句返回的是一个结果集,但有时候应用程序并不总是能对整个结果集进行有效地处理,游标便提供了这样一种机制,它能从包括多条记录的结果集中每次提取一条记录,游标总是与一跳SQL选择语句相关联,由结果集和指向特定记录的游标位置组成。

  • SQL Server支持3中游标实现:

    • 基于DECLARE CURSOR 语法,主要用于T_SQL脚本,存储过程和触发器。
    • 支持OLE DB和ODBC中的API游标函数,API服务器游标在服务器上实现。
    • 由SQL Server Native Client ODBC驱动程序和实现ADO API的DLL在内部实现。
  • 游标创建语法

    DECLARE cursor_name CURSOR [ LOCAL | GLOBAL]
    	- cursor_name:是所定义的T_SQL 服务器游标的名称。
    	- LOCAL:对于在其中创建批处理、存储过程或触发器来说,该游标的作用域是局部的。
    	- GLOBAL:指定该游标的作用域是全局的
    [ FORWARD_ONLY | SCROLL ]
    	- FORWARD_ONLY: 指定游标只能从第一行滚动到最后一行。
    [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
    	- STATIC: 定义一个游标,以创建将又该游标使用的数据临时复本,对游标的所有请求都从tempdb中的这以临时表中不得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。
    	- KEYSET: 指定当游标打开时,游标重的行的成员身份和顺序已经固定。对行进行唯一标识的键值内置在tempdb内一个称为keyset的表中。
    	- DYNAMIC: 定义一个游标,以反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改,动态游标不支持ABSOLUTE提取选项。
    	- FAST_FORWARD: 指定启动了性能优化的FORWARD_ONLY、READ_ONLY游标。如果指定了SCROLL或FOR_UPDATE,则不能指定FAST_FORWARD。
    [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
    	- SCROLL_LOCKS:指定通过游标进行的定位更新或删除一定会成功。
    	- OPTIMISTIC:指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。 
    [ TYPE_WARNING ] 
    	- TYPE_WARNING:指定游标从所请求的类型隐式转换为另一种类型时,向客户端发送警告消息。 
    FOR select_statement
    	- select_statement:是定义游标结果集中的标准SELECT语句。
    [ FOR UPDATE [ OF column_name [,...n] ] ]	
    
  • 游标案列

    DECLARE @varcursor cursor,@name nchar(10),@age int; -- 申明游标变量
    DECLARE cursor_student cursor for select sname,age from test.Student;-- 创建游标
    open cursor_student -- 打开游标
    set @varcursor=cursor_student -- 为游标变量赋值
    fetch next from @varcursor into @name,@age  -- @@FETCH_STATUS 只有在fetch语句之后才能改变为@@FETCH_STATUS=0
    while (@@FETCH_STATUS=0) -- 判断fetch语句是否执行成功
    begin 
    	fetch next from @varcursor into @name,@age -- 读取游标变量中的数据
    	print @name
    end
    close @varcursor   -- 关闭游标
    deallocate @varcursor -- 释放游标
    
    

@@ FETCH_STATUS

  • 0 FETCH语句成功。
  • 1 FETCH语句失败,或者该行超出了结果集。
  • 2 提取的行丢失。
  • 9 游标未执行获取操作。
    参考文章
    https://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html
    https://www.cnblogs.com/selene/p/4480328.html
命令行驱动视频剪辑:cutcli与AI自动化工作流实战 在视频内容创作领域,自动化与批量化处理是提升生产效率的关键。传统图形界面工具在应对重复性任务时往往效率低下,而通过命令行接口(CLI)驱动视频生成,则能实现流程的程序化控制。其技术原理在于将视频结构抽象为可编程的指令序列,通过解析命令生成标准化的工程文件。这种模式的核心价值在于将视频制作从手动操作转变为代码驱动,特别适合与AI编程助手集成,实现自然语言到视频草稿的自动转换。应用场景广泛覆盖社交媒体内容批量生产、教育视频自动化生成、数据可视化视频组装等领域。本文以cutcli工具为例,深入解析如何通过命令行与 阅读详情

相关推荐

10、SQL Server 存储过程、触发器与游标全解析

本文深入解析了 SQL Server 中的三大核心功能:存储过程、触发器和游标。详细介绍了它们的概念、使用方法、适用场景以及性能优化建议,并通过实际案例帮助读者更好地理解和应用这些功能。同时,还总结了常见错误及解决方法,助力高效数据库开发与管理。

m5n6o7的博客 199

SQL Server基础之游标

游标SQL Server的一种数据访问机制,它允许用户访问单独的数据行。用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成的SQL代码并立即执行或输出。游标是一种处理数据的方法,主要用于存储过程,触发器和 T_SQL脚本中,它们使结果集的内容可用于其它T_SQL语句。在查看或处理结果集中向前或向后浏览数据的功能。类似与C语言中的指针,它可以指向结果集中的任意位置,当要对结果集进行逐条单独处理时,必须声明一个指向该结果集中的游标变量。

李赛赛的专栏 1万+

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。

2万+

SQL SERVER中的游标

游标的概念 游标是一种能从包含多个元组的集合中每次读取一个元组的机制。游标总是和一段SELECT语句关联,SELECT语句查询出的结果集就作为集合,游标能每次从该集合中读取出一个元组进行不同操作。 游标的作用 将游标定位在结果集特定元组。 将游标指定结果集中的元组数据读出。 利用循环读取结果集中的多个元组数据。 对游标指定结果集的元组进行数据修改。 为其它用户设置结果集数据的更新限制。 提供脚本、存储过程和触发器中访问结果集中数据的TSQL语句。 SQL SERVER游标类型...

qq_44540985的博客 1万+

sqlserver 中的游标

DECLARE @DeviceID bigint,@MaterialID bigint DECLARE My_Cursor CURSOR --定义游标 FOR ( SELECT device_id, material_id FROM [dbo].[tablename] ) OPEN My_Cursor;--打开游标 FETCH NEXT FROM My_Cursor INTO @DeviceID,@MaterialID;--读取第一行数据 WHILE @@FETCH_STATUS = 0 BEGIN

qq_41827511的博客 8681

SQL server游标详解

游标存储的是数据集,我们可以将select * from table所查询到的数据放到游标里面。可以提前定义好变量,存储从游标单个拿出来的数据,可以方便我们更精确的对每条数据进行判断和处理。下面是我在实际开发过程中,使用游标的详细例子(我将游标放在了存储过程里面)获取游标中的第一条数据,并将其赋值给上面定义好的。移动游标到下一条, 并将其赋值给上面定义好的。值得注意的是获取第一条的时候用的是。

weixin_44282801的博客 880

Sql Server 游标(利用游标逐行更新数据)、存储过程

游标中用到的函数,就是前一篇文章中创建的那个函数。 另外,为了方便使用,把游标放在存储过程中,这样就可以方便地直接使用存储过程来执行游标了。 1 create procedure UpdateHKUNo --存储过程里面放置游标 2 as 3 begin 4 5 declare UpdateHKUNoCursor cursor --声明一个游标,查询满足条件的数据 ...

weixin_30256505的博客 2947

SQL Server学习:存储过程中Cursor(游标)的使用

SQL Server中的游标声名后,一定要显示的释放。若未释放,再次执行时,则会出现“游标XX已经存在”的异常。Open游标后,一定要显示的Close。 在存储过程中试用Cursor的示例: IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='my_sp_test' AND TYPE='P') BEGIN DROP PROCEDURE my_s

Chen_yu_ting的专栏 5474

SQL Server 存储过程、触发器、游标

存储过程 1、存储过程是事先编好的、存储在数据库中的程序,这些程序用来完成对数据库的指定操作。 2、系统存储过程: SQL Server本身提供了一些存储过程,用于管理有关数据库和用户的信息。 用户存储过程: 用户也可以编写自己的存储过程,并把它存放在数据库中,供客户端调用。 3、这样安排的主要目的就是要充分发挥数据库服务器的功能,尽量减少网络上...

weixin_34387468的博客 284

sql server 存储过程使用游标记录

sql server 存储过程使用游标记录--方便下次参考使用 游标的组成: 声明游标 打卡游标 从一个游标中查找信息 关闭游标 释放游标 游标类型: 静态游标 动态游标 只进游标 键集驱动游标 静态游标:静态游标的完整结果集在游标打开时建立在tempdb中。静态游标总是按照游标打开时的原样显示结果集。 静态游标在滚动期间很少或根本监测不到变化,虽然在te...

weixin_30700977的博客 141

存储过程sql server游标实现先进先出的原则

 create table Test  (  Style varchar(20),--样式  Color varchar(20),--颜色  Size varchar(20),--尺寸  Price  decimal(18,2),--价格  Quantity  int,--库存  InDate datetime--入库时间  )  GO   insert into Test values('A...

某某xl 1682

Sql server存储过程中常见游标循环用法

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTA...

weixin_34025051的博客 319

SQLSERVER 存储过程-临时表存储&游标循环

FOR SELECT TOP 99999999 id,tenant_id,process_seq,workstations FROM rms_process_route_detail WHERE is_deleted = 0 AND process_route_id = @process_route_id ORDER BY process_seq --查出需要的集合放到游标中。print '工艺路线标识(内部)111:'+convert(varchar,@indexMin)

blue_wmm的博客 2983

sql service 存储过程游标的使用

1、建表 DROP TABLE dbo.users GO CREATE TABLE dbo.users ( id int NOT NULL , name varchar(32) NULL  ) GO ALTER TABLE dbo.users ADD PRIMARY KEY (id) GO 2、添加数据 --删除存储过程 if (exists (select * from

心疼笔记本 587

SQL Server 数据库之游标

游标1. 游标的概述2. 游标的优点3. 游标的类型3.1. T-SQL 游标3.2. API 游标3.2.1. 静态游标3.2.2. 动态游标3.2.3. 只进游标3.2.4. 键集驱动游标4. 客户端游标 1. 游标的概述 游标SQL Server 数据库开辟的一个缓冲区; 在 SQL Server 数据库中,游标是指向一个查询结果集的一个指针,是通过定义语句和一条 SELECT 语句关联的 SQL 语句; 游标的实际上是从一种包括多条数据记录的结果集中每次提取一条记录的机制 ; 游标中包含游标结果

程序员小白的博客 2734

SQLServer游标(Cursor)简介和使用说明 及全局变量说明和功能

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。       1.游标的组成       游标包含两个部分:一个是游标结果集、一个是游标位置。       游标结果集:定义该游标得SELECT语句返回

lscbfntxgt的博客 2547

sql server游标详解

定义:算了, 我按照自己理解说吧,除了where 语句能选出一个特定的结果集, 但是我要是对这个结果集,对这个结果集进行逐条操作, 是没有这个功能的, 那么游标就可以实现这个操作,游标说白了, 就是我先取一个结果集,然后后对这个结果集逐条进行操作!!!!!

guokeeiron的博客 3107

sqlserver存储过程简单游标示例

sqlserver存储过程游标

bcbobo21cn的专栏 1562

dell h710 h710p h310 刷it直通卡

dell h710 h710p h310 刷it直通卡

上一篇: kafka快速入门
下一篇: docker kafka 启动Error
腹黑客
博客等级 码龄11年 39粉丝 112原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值