SQLServer存储过程和触发器学习记录及简单例子
存储过程即为能完成特定功能的一组SQL语句集。如果需要对查出的多条数据进行操作的话,这里需要理解游标(CURSOR)的概念,对于oracle有for each row命令,可以不用游标。
游标可以理解为一个结果集,描述cursor的关键字有:
SCROLL关键字指明游标可以在任意方向上滚动
FORWARD_ONLY指明游标只能向前滚动。
READ ONLY指明在游标结果集中不允许进行数据修改。
UPDATE关键字指明游标的结果集可以修改。
GLOBAL关键字使得游标对于整个连接全局可见
LOCAL关键字指明游标是局部的,它只能在它所声明的过程中使用。
等等。。。
一般结果集需要遍历,如例,将一些表中的字段查出来,插入到另外一张表中:
例1:查询表数据插入到另外一张表
CREATE PROCEDURE sp_insertIntoTest_hibernate
AS
DECLARE @projectid VARCHAR(20)
DECLARE @projectcode VARCHAR(20)
DECLARE @projectname VARCHAR(100)
DECLARE @projectamount DECIMAL(16,2)
DECLARE @remark VARCHAR(1000) DECLARE cs CURSOR FOR --定义游标的数据集 SELECT L.PROJECTID,P.CODE,L.PROJECTNAME,L.LEASINGAMOUNT, L.proInfoSummary
FROM LAPROJECT L LEFT JOIN PARTY_CUSTOMER P ON P.ID=L.TENANTID
WHERE (L.TENANTID<>'' AND L.TENANTID IS NOT NULL) ORDER BY L.PROJECTID BEGIN
DELETE FROM test_hibernate
OPEN cs --打开游标
FETCH NEXT FROM cs INTO @projectid,@projectcode,@projectname,@projectamount,@remark --从游标中取值赋给变量
WHILE @@FETCH_STATUS = 0 --fetch语句执行成功返回0,fetch语句执行失败或者此行不在结果集中返回-1,被提取的行不存在则返回-2.
BEGIN
PRINT '====start insert===='
INSERT INTO test_hibernate VALUES(@projectid,@projectcode,@projectname,@projectamount,@remark)
PRINT '==== end insert===='
FETCH NEXT FROM cs INTO @projectid,@projectcode,@projectname,@projectamount,@remark --继续取下一行数据
END
CLOSE cs --关闭游标
DEALLOCATE cs --删除游标
END
这个sp起初运行的时候老是报游标已存在问题,时不时还报游标不存在,郁闷。后来修改了下存储过程换了个游标名称就好了,网上查了很多说是游标没关闭没释放或者是关闭释放位置不对等问题,自己实践证明我的问题不是这样的,至今搞不懂是啥原因造成的问题,可能是第一次写sp的时候没释放,后面加上了释放和删除那两句话吧。
例2:分页查询
CREATE PROCEDURE sp_getpermbal
@pageSize INT,
@page INT
AS
DECLARE @temp INT SET @temp=@pageSize*(@page-1)
BEGIN
SELECT TOP (SELECT @pageSize) * FROM LAPERMBAL
WHERE projectid+contractid+grantid+convert(varchar(20),retsn)+convert(varchar(10),ratebtdt,120) NOT IN
(SELECT TOP (SELECT @temp) projectid+contractid+grantid+convert(varchar(20),retsn)+convert(varchar(10),ratebtdt,120)
FROM LAPERMBAL ORDER BY projectid,contractid,grantid,retsn,ratebtdt DESC)
ORDER BY projectid,contractid,grantid,retsn,ratebtdt DESC
END
这个查数据需要用到主键,而本例的表使用联合主键,所以进行拼接来识别一条数据的唯一性。
二、触发器(SQLServer)
触发器都说是一种特殊的存储过程,那我也就这么理解了,还挺有道理的、让人比较容易接受的解释。在数据库的表数据有增、删、改的操作时可自动触发的存储过程。
首先理解inserted和deleted两张虚表,看了下oracle相关的内容,应该是用new和old两张虚表,取值可用new.字段名,old.字段名。
新增操作新增的记录存到系统建的虚表inserted中,deleted表无记录;
删除操作删除的记录存到系统建的虚表deleted中,inserted表无记录;
修改操作(分解为先删除再插入)删除的记录存到系统建的虚表deleted中,新增的记录存到inserted表中。
然后就是触发器类型,after触发器和instead of 触发器,这个不理解的可以百度,有很多比我解释的更清楚的大神写的文章。
理解完之后,记录下相关语法:
新建触发器:
例:更新test_hibernate表,则将被更新记录的字段值置为“test success---”
CREATE TRIGGER test_trigger
ON test_hibernate
FOR UPDATE
AS
DECLARE @projectid VARCHAR(20),@projectcode VARCHAR(20)
DECLARE cs CURSOR local FOR
SELECT projectid,projectcode FROM deleted
BEGIN
OPEN cs
FETCH NEXT FROM cs INTO @projectid,@projectcode
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE test_hibernate SET remark='test success---' WHERE projectid=@projectid AND projectcode=@projectcode
FETCH NEXT FROM cs INTO @projectid,@projectcode
END
CLOSE cs
DEALLOCATE cs
END
GO
修改触发器:
ALTER TRIGGER test_trigger
ON test_hibernate
FOR UPDATE
AS
......
禁用、启用触发器:
ALTER TABLE test_hibernate DISABLE TRIGGER test_trigger
ALTER TABLE test_hibernate ENABLE TRIGGER test_trigger ALTER TABLE test_hibernate DISABLE TRIGGER ALL
ALTER TABLE test_hibernate ENABLE TRIGGER ALL
关于触发器的内容,可以参考这位大哥的http://www.cnblogs.com/hoojo/archive/2011/07/20/2111316.html,个人觉得写得简单易懂。
SQLServer存储过程和触发器学习记录及简单例子的更多相关文章
- SQL server触发器学习记录
作为C#程序员,我工作内容基本就是winform,wpf,asp.net.sql接触的比较少,今天突然来了一个ticket要我修改触发器脚本....只会select*的我顿感迷茫... 需求描述:as ...
- Spring学习记录2——简单了解Spring容器工作机制
简单的了解Spring容器内部工作机制 Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh()方法定义了Sp ...
- Metasploit学习记录---Nessus简单使用
1.更新插件 上次搭建完后总觉得不踏实,因为老是提示插件多久没更新了,然后果断花了1.25美刀买了台vps,终于把最新的插件下载下来了,总共190M,需要的QQ私信我.
- uni-app学习记录06-Vuex简单使用
import Vue from 'vue' // 这里引入vuex import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Stor ...
- Robot Framework与Web界面自动化测试学习笔记:简单例子
假设环境已经搭建好了.这里用RIDE( Robot Framework Test Data Editor)工具来编写用例.下面我们对Robot Framework简称rf. 我们先考虑下一个最基本的登 ...
- zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP
阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库 http://download.zeromq.org ...
- Material Calendar View 学习记录(二)
Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...
- Sqlserver中存储过程,触发器,自定义函数(一)
Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. ...
- Sqlserver中存储过程,触发器,自定义函数
Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...
随机推荐
- js : json和 cookie 的简单操作
使用 cookie,可以记录用户的最近的浏览历史 <!DOCTYPE HTML> <html lang="zh-cn"> <head> < ...
- 《构建之法》8&16
[8.1] 对产品的生命周期管理好像一直以来都没有引起我足够的重视,在这一段对产品学习的过程中也少有看到相关内容.是因为针对不同产品而言,产品周期的管理太具有个性特征,没有太统一的规则可循吗?我觉得不 ...
- Strus2第一次课:dom4j操作xml
先从底层的xml操作技术记录: 当我们新建一个项目,什么架包都没加入的时候,java提供了 org.w3c.dom给我们操作xml里面的元素 import org.w3c.dom.Document; ...
- typeof,GetType
typeof: 是运算符,获得某一类型的 System.Type 对象. Int32 t = new Int32(); Type t = typeof(int); GetType: 是方法,获取当前实 ...
- UIStackView使用 (堆视图)
一基本使用 1创建多个子控件 for (int i = 0; i < 3; i++) { UIButton *imgBtn = [UIButton buttonWithType:UIButton ...
- ViewPager onPageChangeListener
今天在做项目的时候,由于要处理viewPager页面滑动的事件,所以对其进行了一个小小的研究: 首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageC ...
- weex 小结--内建模块
使用以下模块时,需要导入依赖:var *** = require('@weex-module/****'); 1. navigator --像浏览器一样切换页面 2. webview(module) ...
- redsocks 将socks代理转换成全局代理
redsocks 需要手动下载编译.前置需求为libevent组件,当然gcc什么的肯定是必须的. 获取源码 git clone https://github.com/darkk/redsocks 安 ...
- 小程序 web 端实时运行工具
微信小程序 web 端实时运行工具 https://chemzqm.github.io/wept/
- java aes_cbc_256 加密解密
在之前我们在openssl上和ios上分别测试了 AES256位cbc模式的加密和解密 今天用java提供的api来测试一下:进而确定一下在PC,iOS,安卓上三个平台下的加密解密数据: 1. 首先通 ...