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触发器:发生在数据操作语言执行时触发执行的 ...
随机推荐
- PL/SQL通过免安装客户端连接远端ORACLE数据库
参考百度经验:http://jingyan.baidu.com/article/375c8e19b4094d25f2a2291a.html
- jquery总结06-动画事件01-基础显示和隐藏
动画事件 .hide(option) 动画隐藏 会保存元素的原始属性值 $("#a2").hide({ duration: 3000, complete: function() ...
- 漂亮的Linux命令提示符
漂亮的Linux命令提示符 每天面对着白底黑字(黑底白字)的命令行是否枯燥泛味呢?生活应给是五彩缤纷的,何不为单调无味的生活增添一抹色彩? 下面一起体验一下Linux命令行提示符惊险的整容之旅 惊鸿一 ...
- 修改CMD字符编码
1.参考网址: 1.1.http://blog.useasp.net/archive/2012/04/24/how_to_use_UTF8_encoding_in_Windows_CMD.aspx 1 ...
- socket了解(转)
http://blog.chinaunix.net/uid-26000296-id-3758651.html http://blog.csdn.net/mengyafei43/article/deta ...
- mysql order by in 的字符顺序
//MySQL 语句SELECT * FROM `MyTable`WHERE `id` IN (11,1,111) ORDER BY FIELD(`id`, 11,1,111); laravel 框架 ...
- mysql 命令(二)
1.创建数据库,并制定默认的字符集是utf8. CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_g ...
- Eenterprise linux服务器分区
分区说明: (在MBR格式的硬盘下我会分/ /boot swap /data 四个分区,不建议在服务器上面使用LVM,中大型企业的IDC都是有存储区域的,专门管理硬盘容量的.)(分区的时候,请注意顺序 ...
- 在eclipse中用gradle搭建MapReduce项目
我用的系统是ubuntu14.04新建一个Java Project. 这里用的是gradle打包,gradle默认找src/main/java下的类编译.src目录已经有了,手动在src下创建main ...
- 本机不能访问虚拟机中flask的web服务器的解决办法
在虚拟机的linux里写flask程序,在本机中用"ip:端口号"的方法不能访问,查资料试了各种方法都不行.最后发现问题出在flask程序本身: flask的app.run()方法 ...