一、存储过程

  存储过程即为能完成特定功能的一组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. Maven学习随笔二——Maven初始配置

    到现在为止,我对maven的理解是,跟svn差不多,帮我们管理项目的工具,到底是不是这样,拭目以待!! 弱弱解释,svn是什么? 简单的说,您可以把SVN当成您的备份服务器,更好的是,他可以帮您记住每 ...

  2. Python笔记(1)变量与表达式

    列表list list是用的最多的类型 可以count计数 可嵌套,多钟类型并存 支持 + * a = [1,2,3] a_ref = a a_copy = a[:] 引用,a变化a_ref也变化 指 ...

  3. iOS 支付宝第三方使用步骤

    使用支付宝进行一个完整的支付功能,大致有以下步骤: 1 与支付宝进行签约,获得商户ID(partner)和账号ID(seller) 2 下载相应的公钥私钥文件(加密签名用) 3 下载支付宝SDK 4 ...

  4. 【Cocos2d-Js基础教学(6)网络层(弱联网)的封装及使用】

    谈到联网,在游戏中也是非常核心的模块,在官方Js-test中我们可以找到联网部分 的NetworkTest文件下有两个类 SocketIOTest.js(Socket 类) WebSocketTest ...

  5. Centos7下修改默认网卡名(改为eth0)的操作记录

    安装好centos7版本的系统后,发现默认的网卡名字有点怪,为了便于管理,可以手动修改.下面对centos7版本下网卡重命名操作做一记录:1)编辑网卡信息[root@linux-node2~]# cd ...

  6. 很多k线形态或k线组合是需要验证的

    1.十字星:表明多空力量平衡.是否翻转,需要验证. 2.要反应市场心理的k线才是有效的K线,不然就是伪k或伪k线形态.

  7. HDNOIP201404最短路径

    HDNOIP201404最短路径 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 a.b.c是3个互不相等的1 ...

  8. Provisioning Profile 导入真机

    双击Provisioning Profile文件. 然后在xcode中运行. 会自动导入手机.

  9. sql 给数据库表 字段 添加注释

    最近发现一些代码生成器 有针对注释做一个很好的转化,之前建表的时候 没有这块的注释.现在想增加,专门去看了下 如何增加注释 1 -- 表加注释 2 EXEC sys.sp_addextendedpro ...

  10. *[topcoder]IncrementingSequence

    http://community.topcoder.com/stat?c=problem_statement&pm=12107 此题想了半天,当时瞥到了Greedy,所以就想着贪心,最后的方法 ...