一、存储过程

  存储过程即为能完成特定功能的一组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存储过程和触发器学习记录及简单例子的更多相关文章

  1. Metasploit学习记录---Nessus简单使用

    1.更新插件 上次搭建完后总觉得不踏实,因为老是提示插件多久没更新了,然后果断花了1.25美刀买了台vps,终于把最新的插件下载下来了,总共190M,需要的QQ私信我.

  2. Robot Framework与Web界面自动化测试学习笔记:简单例子

    假设环境已经搭建好了.这里用RIDE( Robot Framework Test Data Editor)工具来编写用例.下面我们对Robot Framework简称rf. 我们先考虑下一个最基本的登 ...

  3. zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP

    阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库  http://download.zeromq.org ...

  4. Material Calendar View 学习记录(二)

    Material Calendar View 学习记录(二) github link: material-calendarview; 在学习记录一中简单翻译了该开源项目的README.md文档.接下来 ...

  5. Sqlserver中存储过程,触发器,自定义函数(一)

    Sqlserver中存储过程,触发器,自定义函数 1.存储过程有关内容存储过程的定义:存储过程的分类:存储过程的创建,修改,执行:存储过程中参数的传递,返回与接收:存储过程的返回值:存储过程使用游标. ...

  6. Sqlserver中存储过程,触发器,自定义函数

    Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...

  7. SQL Serever学习14——存储过程和触发器

    存储过程 在数据库中很多查询都是大同小异,编写他们费时费力,将他们保存起来,以后执行就很方便了,把SQL语句“封装”起来. 存储过程的概念 存储过程是一组SQL语句集,经过编译存储,可以”一次编译,多 ...

  8. 利用navicat创建存储过程、触发器和使用游标的简单实例

    利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报  分类: 数 ...

  9. 创建并在项目中调用SQLSERVER存储过程的简单示例

    使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用.创建存储过程 和数据表一样,在使用之前需要创建存储过程,它的简明语法是: 引用: Create PROC ...

随机推荐

  1. Gemfile分平台加载gem

    Gemfile分平台加载gem 区分平台以便加载不同的web server,象tzinfo-data只适用于windows # Windows does not include zoneinfo fi ...

  2. 初涉Linux ----------&gt; 打造自己的 Vim IDE

    一.  开篇前言 (图片显示越界的话,请刷新) 装好Ubuntu15.04系统之后呢,玩了玩 Ubuntu,感觉还是很不错的.比windows快,一开机就可以打开你想要的程序,但是在windows下你 ...

  3. javascript的propertyIsEnumerable()方法使用介绍

    hasOwnProperty() 方法用来判断某个对象是否含有指定的自身属性. propertyIsEnumerable()是用来检测属性是否属于某个对象的,如果检测到了,返回true,否则返回fal ...

  4. php上传文件大小限制修改

    打开php.ini 1.最大上传文件大小: upload_max_filesize=2M 改成自己需要的大小 2.最大post大小: post_max_size=2M 改成自己需要的大小,第二个一般比 ...

  5. SPOJ GSS1 静态区间求解最大子段和

    题目大意: 给定n个数,再给q个区间询问,希望在区间s,t中找到一段连续的子序列使其和最大 因为询问上万,节点数50000,明显是用线段树去做,这里很明显的区间更新,唯一写起来有点恶心的是询问 每一个 ...

  6. UE4编程之C++创建一个FPS工程(二)角色网格、动画、HUD、子弹类

    转自:http://blog.csdn.net/u011707076/article/details/44243103 紧接上回,本篇文章将和大家一同整理总结UE4关于角色网格.动画.子弹类和HUD的 ...

  7. poj 2409(polya定理模板)

    题意:给你n种颜色和m个小球,问你有多少种不同的方案! 分析:作为模板.. 代码实现: #include <iostream> #include <cstdio> #inclu ...

  8. windows下安装ubantu

        首先声明我是一个linux大菜鸟,之所以学这个,一个是好玩,另外做DL的一些软件如Caffe要在这个平台上运行,所以没事就鼓捣鼓捣.linux是一种内核,市场上支持这种内核的操作系统有uban ...

  9. HDOJ/HDU 1015 Safecracker(深搜)

    Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...

  10. boostrap---btn

    bootstrap入门教程,按钮.按钮风格.下拉菜单等 本教程演示: bootstrap框架的按钮.按钮大小.按钮风格.按钮组.下拉菜单制作等. 使用的版本:Bootstrap v2.3.2 . 下面 ...