MS SQL Server之光标、存储过程和触发器
光标
通常数据库操作被认为是以数据集为基础的操作,但是光标被用于以记录为单位来进行操作,来获取数据库中的数据的子集。光标一般用于过程化程序里的嵌入的SQL语句。
对光标的定义如下:
DECLARE CURSOR_NAME CURSOR
FOR SELECT_STATEMENT
[FOR [READ ONLY | UPDATE {[COLUMN_LIST]}]
光标创建之后可以进行如下操作:
OPEN:打开定义的光标。
OPEN CURSOR_NAME
FETCH:从光标获取记录,赋予程序变量。
FETCH NEXT FORM CURSOR_NAME [ INTO FETCH_LIST ]
例如:
BEGIN
DECLARE @custname VARCHAR(30);
DECLARE namecursor CURSOR FOR SELECT CUST_NAME FORM TBL_CUSTOM OPEN namecursor;
FETCH NEXT FROM namecursor INTO @custname
WHILE (@@FETCH_STATUS<>-1)
BEGIN FETCH NEXT FORM namecursor INTO @custname
print 'custname:'+@custname
END CLOSE namecursor
DEALLOCATE namecursor//释放资源
END
CLOSE:对光标操作完成之后,关闭光标。
存储过程
存储过程是一组关联的SQL语句,通常被成为函数和子程序。存储过程可以嵌套在另一个存储过程里面。
在SQL Server定义存储过程如下:
GO
/****** Object: StoredProcedure [dbo].[select_terminal] Script Date: 08/06/2015 13:51:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[select_terminal]
--(
--@id int
--)
-- Add the parameters for the stored procedure here
--<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
--<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
declare @tsn varchar(50)
--declare @isOnline int declare QueryTsn cursor for select top 10 tsn from tTerminal
OPEN QueryTsn; fetch next from QueryTsn into @tsn while (@@FETCH_STATUS=0)
BEGIN
Fetch next from QueryTsn into @tsn
print 'tsn:'+convert(varchar,@tsn)
END
close QueryTsn
deallocate QueryTsn -- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
--SET NOCOUNT ON; -- Insert statements for procedure here
--SELECT * from tTerminal where ID=@id
END
执行存储过程如下:
USE [DB_NAME]
GO DECLARE @return_value int EXEC @return_value = [dbo].[select_terminal] SELECT 'Return Value' = @return_value GO
触发器
触发器是数据中编译了的SQL过程,基于数据库里发生的其他行为来执行操作。可以在insert、delete或update之后执行,可以检查数据完整性,可以回退事务。
SQL Server 创建触发器的语法如下:
CREATE TRIGGER TRIGGER_NAME
ON TABLE_NAME
FOR {INSRT | UPDATE | DELETE [, ..]}
AS
SQL_STATEMENTS [ RETURN ]
例如:
USE [DB_NAME]
GO
/****** Object: Trigger [dbo].[createtable] Script Date: 08/06/2015 14:28:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO ALTER TRIGGER [dbo].[createtable]
ON [dbo].[t508]
FOR Insert
AS
BEGIN
declare @sqlstr varchar(1000)
set @sqlstr = 'CREATE TABLE [dbo].[zlogt508](
[ID] [int] IDENTITY(1,1) NOT NULL,
[mID] [int] NOT NULL,
[gpsTime] [datetime] NOT NULL,
primary key ([ID]))
'
exec(@sqlstr)
PRINT 'You must ask your DBA to drop or alter tables!' END
***创建的触发器在要触发的表的触发器文件内
删除触发器
drop trigger trigger_name
版权声明:本文为博主原创文章,未经博主允许不得转载。
MS SQL Server之光标、存储过程和触发器的更多相关文章
- 遍历SQL SERVER中所有存储过程和触发器
如果需要查找某个存储过程或触发器中是否含有某段文本(比如:你想知道有哪些存储过程操作了某个表) 可以这么写 select name from sysobjects o, syscomments s w ...
- Sql Server系列:存储过程
1 存储过程简介 存储过程是使用T-SQL代码编写的代码段.在存储过程中,可以声明变量.执行条件判断语句等其他编程功能.在MS SQL Server 2012中存储过程主要分三类:系统存储过程.自定义 ...
- MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建
前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- VFP获取 SQL Server 的数据表、触发器、存储过程、视图等脚本
本文代码转载自红雨先生 *-----------------------------------------------* SqlServer 相关函数*----------------------- ...
- MS SQL SERVER 中的系统表
MS SQL SERVER 中的系统表 序号 名称 说明 备注 1 syscolumns 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行. 2 syscomments 包含每 ...
- (火炬)MS SQL Server数据库案例教程
(火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...
- MS SQL server对象类型type
执行下面代码,将获取ms sql server对象类型以及其说明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREAT ...
- MS SQL SERVER搜索某个表的主键所在的列名
原文:MS SQL SERVER搜索某个表的主键所在的列名 SELECT SYSCOLUMNS.name FROM SYSCOLUMNS,SYSOBJECTS,SYSINDEXES,SYSINDEX ...
随机推荐
- 启动运行下载gradle速度太慢,手动添加
启动运行下载gradle速度太慢,并且容易卡死(感谢群友ˋ狠ㄨ得意提供支持)---国内网络访问地址 我们经常运行项目的时候会需要进行下载gradle,不过由于网络或者和谐的问题经常下载需要花很长时间或 ...
- asp.net 服务器Button控件使用(onclick和onclientclick使用)
<asp:Button ID="btn_Save" class="button green" Style="width: 100px; heig ...
- RestTemplate 请求url
1.get 请求 RestTemplate restTemplate = new RestTemplate(); String url = ""; JSONObject resul ...
- JSP内置对象的解析
JSP九大对象及四大作用域并与之对应图表: 隐式对象 作用域 所属类 application application javax.servlet.ServletContext session sess ...
- C++概念整理
/* 面向对象: 多态, 继承 封装 */ #include <stdio.h> #include <stdlib.h> //一旦有了纯虚函数,该对象就不能实例化了. #def ...
- java 压缩文件 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件
/** * 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件 * * @param files * 文件数组 * @param strZipName * 压缩文件路径及文件名 * @thr ...
- linux iftop流量查看工具的安装与使用
1.安装依赖包yum install flex byacc libpcap ncurses ncurses-devel libpcap-devel 2.下载iftop wget http://www ...
- WCF实现客户端自动更新
IServiceUpdate using System.IO; using System.ServiceModel; using System.ServiceModel.Web; namespace ...
- 如何在IIS 7.5中部署Asp.Net MVC 5的网站
0 Sign in to vote 系统是 windwos 2008 已经安装.Net 4.0 和 .Net 4.5 已经安装MVC4 的需要文件,MVC5 找不见下载地方,求各位大哥告知一下在哪里可 ...
- Linux命令(21)查看文件的行数
在 linux 系统中没有在 windows 系统中那么方便的点点鼠标就可以操作文件了,对文件的各种操作都必须使用各种命令来完成.比如有时候我们需要在不查看文件内容的情况下需要知道该文件有多少行.这个 ...