一、存储过程

  存储过程即为能完成特定功能的一组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. Robot Framework与Web界面自动化测试学习笔记:简单例子

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

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

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

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

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

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

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

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

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

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

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

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

    Sqlserver中存储过程,触发器,自定义函数: 自定义函数:1.函数类型:2.函数的参数和返回值: 1.函数类型:标量值函数,返回的是一个标量值表值函数:内联表值函数:多语句表值函数. 标量值函数 ...

  8. SqlServer存储过程学习笔记(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  9. SQLSERVER存储过程语法详解

    CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ...

随机推荐

  1. Android开发学习之路-Android N新特性-多窗口模式

    我们都知道,在最新的Android N系统中,加入了一个新的功能,就是多窗口模式.多窗口模式允许我们在屏幕上显示两个窗口,每个窗口显示的内容不同,也就是说,我们可以一遍看电视剧,一边聊微信. 这里我们 ...

  2. ms-sql关联表操作

    1.创建数据库employee : create database employee;2.创建员工表EMP:use employee;create table EMP( id int,sex varc ...

  3. 【转】我是如何在SQLServer中处理每天四亿三千万记录的

    原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...

  4. iOS开发零基础--Swift教程 字符串的利用

    字符串的介绍 字符串在任何的开发中使用都是非常频繁的 OC和Swift中字符串的区别 在OC中字符串类型时NSString,在Swift中字符串类型是String OC中字符串@"" ...

  5. 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.2,增加离线消息、离线文件功能(源码)

    (几句题外话:虽然就如何将GG发展为一个有商业价值的产品,我还没有很清晰明确的思路,但是从GG发布以来,通过GG认识了一些朋友,也接了一些小单子,赚了一点小钱.有了一点甜头,目前和2.3个好朋友一起做 ...

  6. 转: CvMat,Mat和IplImage之间的转化和拷贝

    1.CvMat之间的复制 //注意:深拷贝 - 单独分配空间,两者相互独立 CvMat* a; CvMat* b = cvCloneMat(a); //copy a to b 2.Mat之间的复制 / ...

  7. 谈谈final、finally、finalize的区别

    1.final:如果一个类被final修饰,意味着该类不能派生出新的子类,不能作为父类被继承.因此一个类不能被声明为abstract,又被声明为final.将变量或方法声明为final.可以保证他们在 ...

  8. SQL SERVER 高级编程 - 自定义函数 拾忆

    每个人都很忙,但是花10分钟复习下,总结下基础东西还是很有益处的. 背景: 总结一句,使用简便,还能递归,是的SQL更简洁,相对比一大堆的关联语句,而且关联一大堆还不一定实现特定功能.而且共用部分可以 ...

  9. win7计划任务执行BAT文件问题

    今天下午做了一个调用java 可执行jar的程序,想通过win7的计划任务来调用 批处理命令: java -jar BIDropSyc.jar    或者 javaw -jar BIDropSyc.j ...

  10. 使用python求字符串或文件的MD5

    使用python求字符串或文件的MD5 五月 21st, 2008 #以下可在python3000运行. #字符串md5,用你的字符串代替'字符串'中的内容. import hashlib md5=h ...