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

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

1.1存储过程的定义:存放在服务器上预先编译好的sql语句,可以给存储过程传递参数,也可以
从存储过程返回值。

优点:提供了安全访问机制,比如可以将不同的存储过程的执行权限赋予权限不同的用户;
改进了执行性能,因为存储过程是预编译的;
减少了网络流量,因为在调用存储过程时,传递的字符串很短,没有很长的sql语句;
增强了代码的重用性。

1.2分类:系统存储过程,sp_开头;
扩展存储过程,xp_开头,允许其他高级语言编写,如c#,以dll形式存在;
用户自定义存储过程:
T_SQL存储过程;
临时存储过程;
局部:命名以 # 开头;
全局:命名以 ## 开头;
CLR存储过程。

1.3存储过程的创建,修改,执行:
首先确定三个组成部分:
输入参数和输出参数;
sql语句;
返回的状态值,指明执行状态。

简单语法:
eg1:查询指定数据库表orders中的记录个数

 create proc CountOfOrders--指定存储过程名
as--指定存储过程的主体
begin
declare @CountOfOrders as int--声明一个作为int类型的存储过程的内部变量
select @CountOfOrders = Count(*) fromt orders--将sql语句的返回值赋给前面定义的变量
print convert(verchar(10),@CountOfOrders)--将变量转换为字符串型打印
end
go--确定一个执行计划
exec CountOfOrders--执行过程

以stuinfo表为例子:

 create     proc countofinfoq
as
begin
declare @CountOfOrders as int--声明一个作为int类型的存储过程的内部变量
select @CountOfOrders = Count(*) from stuDB.dbo.stuInfo--将sql语句的返回值赋给前面定义的变量
--print convert(varchar(10),@CountOfOrders)--将变量转换为字符串型打印
print @CountOfOrders
end
exec countofinfoq

eg2:查询任意数据库表的记录个数,这里需要指定参数,要注意参数的定义和执行的时的参数传递

 create proc CountOfTable
@TableName as Varchar(20)--定义一个普通的参数
as
begin
declare @Count as int
exec('select * into tmptable from ' + @TableName)--参数的使用方法,这里exec相当于调用一个新的存储过程
select @Count=Count(*) from tmptable--用临时表缓存原表的数据,对临时表操作完后,删除临时表
drop table tmptable
return @Count--存储过程的返回值,只能是整数值!!!
end
declare @Count as int --声明一个变量接收返回值
exec @Count=CountOfTable 仓库
print @Count

以stuinfo表为例子:

  select * from stuinfo
drop table stuinfobak1
select * into stuDB.dbo.stuinfobak1 from stuinfo
go
create proc CountOfTable1
@TableName as Varchar(20)--定义一个普通的参数
as
begin
declare @Count as int
exec('select * into stuDB.dbo.stuinfobak2 from ' + @TableName)--参数的使用方法,这里exec相当于调用一个新的存储过程
select @Count=Count(*) from stuDB.dbo.stuinfobak2--用临时表缓存原表的数据,对临时表操作完后,删除临时表
drop table stuinfobak2
return @Count--存储过程的返回值,只能是整数值!!!
end
go
declare @Count as int --声明一个变量接收返回值
exec @Count=CountOfTable1 stuinfo
print @Count

调用:

 declare @Count as int   --声明一个变量接收返回值
declare @Table as varchar(20)
set @Table = '仓库'
exec @Count=CountOfTable @Table
print @Count

eg3:参数传递方式:

 create proc ParamsTransfer
@类别名称 varchar(15),
@单价 money=$10,
@库存量 smallint,
@订购量 smallint = 5--带默认值,假如没有给它传值,则使用默认值
as
begin
select * from 产品
join 类别 on 产品.id = 类别.id
where
类别.类别名称=@类别名称 and
产品.单价 > @单价 and
产品.库存量 > @库存量 and
产品.订购量 > @订购量
end
exec ParamsTransfer 饮料,1,10,20--顺序传值
exec ParamsTransfer @单价=1,@订购量=20,@库存量=10,@类别名称='饮料'--不按顺序传值
exec ParamsTransfer 饮料,default,10,default--使用默认值
exec ParamsTransfer 饮料,default,10--不指定default也是使用默认值
exec ParamsTransfer @类别名称='饮料',@库存量=10--不按顺序并且使用默认值的传值

--eg4:存储过程的返回值: return一个整数值;使用output参数;返回结构集。

 select * from stuinfo
select * from stuinfobak1
drop table stuinfobak1
select * into stuDB.dbo.stuinfobak1 from stuinfo
go
create proc ReturnValue
@返回值1 varchar(20) output
as
begin
declare @返回值2 int
declare @stuID库数 int
select @stuID库数=Count(distinct stuID) from stuinfo set @返回值1 = '' + cast(@stuID库数 as varchar(10))
select @返回值2=Count(distinct stuID) from stuinfo
return @返回值2
end
go
declare @接收值1 varchar(20)
declare @接收值2 int
exec @接收值2=ReturnValue @接收值1 output
print @接收值1
print @接收值2 go
alter proc ReturnValue
@返回值1 varchar(20) output
as
begin
declare @返回值2 int
declare @stuID库数 int
select @stuID库数=Count(distinct stuID) from stuinfo set @返回值1 = '----' + cast(@stuID库数 as varchar(10))
select @返回值2=Count(distinct stuID) from stuinfo
return @返回值2
end
go
declare @接收值1 varchar(20)
declare @接收值2 int
exec @接收值2=ReturnValue @接收值1 output
print @接收值1
print @接收值2

--eg5:调用存储过程返回一个打开的游标,这个是存储过程跟游标的小结合 ----------------------还是看不懂。。

 create proc UseCursor
@cursor cursor Varying output
as
begin
set @cursor=Cursor forward_only static for
select top 10 * from 订单
open @cursor
end
declare @my_cursor cursor
declare @订单号 varchar(20)
declare @供应商号 varchar(20)
declare @职工号 varchar(20)
declare @订单日期 varchar(30)
exec UseCursor @my_cursor output
fetch next from @my_cursor
into @职工号,@订单号,@供应商号,@订单日期
while @@fetch_status=0
begin
print @订单号 + ' -- ' + @订单日期
fetch next from @my_cursor
into @职工号,@订单号,@供应商号,@订单日期
end

Sqlserver中存储过程,触发器,自定义函数(一)的更多相关文章

  1. SQL中存储过程和自定义函数的区别

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  2. SQL中存储过程和自定义函数的区别(转载)

    存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在 ...

  3. C# 得到sqlserver 数据库存储过程,触发器,视图,函数 的定义

    经常从 生产环境 到测试环境, 需要重新弄一整套的数据库环境, 除了表结构以及表结构数据,可以用动软代码生成器 生成之外, 像 存储过程,触发器,等,好像没有批量操作的,意义哥哥农比较麻烦, 所以最近 ...

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

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

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

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

  6. MySQL存储过程/存储过程与自定义函数的区别

    语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...

  7. (转)MySQL存储过程/存储过程与自定义函数的区别

    转自:http://www.cnblogs.com/caoruiy/p/4486249.html 语法: 创建存储过程: CREATE [definer = {user|current_user}]  ...

  8. Oracle存储过程和自定义函数

    新博客文章链接,欢迎大家评论探讨 概述 存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 异同点: 存储过程和存储函数的相同点:完成特定功能的程序. 存储过程和存储 ...

  9. SqlServer中存储过程 returnC#代码处理以及对应的MySQL如何改写

    一.SqlServer 中 1. 创建表 create table testuser( id int, --primary key, names ), address ), paw ) ) 2.创建存 ...

随机推荐

  1. C#开发BHO程序(引)

    一 C#也可以编写BHO程序 因为eve的官方论坛封掉了签名图功能,所以想自己写个BHO插件来“伪造”签名图.研究了几个C++程序,但是始终对响应WebBrowser内的 HTML事件不得其门.这样就 ...

  2. 百度ueditor学习使用

    1.下载ueditor解压 2. jsp里存放着开发所用到的jar包,导入项目即可 前端页面代码如下: <center> <form action="" meth ...

  3. mysql toolkit 用法[备忘] (转)

    命令列表 /usr/bin/pt-agent /usr/bin/pt-align /usr/bin/pt-archiver /usr/bin/pt-config-diff /usr/bin/pt-de ...

  4. Hive(一):架构及知识体系

    Hive是一个基于Hadoop的数据仓库,最初由Facebook提供,使用HQL作为查询接口.HDFS作为存储底层.mapReduce作为执行层,设计目的是让SQL技能良好,但Java技能较弱的分析师 ...

  5. [mysql] MariaDB 10.0.10 GTID复制

    一:概念理解:    1.TID:Transaction ID,即Mysql服务器的事务ID号. 2.GTID:Global Transaction ID,全局事务ID,在整个主从复制架构中任何两个事 ...

  6. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

  7. OpenCV图像处理篇之边缘检测算子

    OpenCV图像处理篇之边缘检测算子 转载: http://xiahouzuoxin.github.io/notes/ 3种边缘检测算子 一阶导数的梯度算子 高斯拉普拉斯算子 Canny算子 Open ...

  8. 借助HTML分别禁用IE8, IE9的兼容视图模式的小技巧

    IE 添加了兼容模式,开启后会以低一版本的 IE 进行渲染,但是我就遇到了一种情况,在 IE8 下只有不使用兼容模式页面才能显示正常,下面有个不错的方法可以解决这个问题 从 IE 8 开始,IE 添加 ...

  9. 把docker当做绿色打包工具

    如题,我只是把docker当成绿色版的各种环境的集成打包工具了 用到了docker的--net=host模式,这个暂时在mac下是有问题的,linux下正常使用,具体docker的网络模式参考这里,此 ...

  10. 黄聪:如何使用WebKitBrowser调用元素点击事件(C#)

    string s = "var _elm = document.getElementById('loginBtn');var _evt = document.createEvent('Mou ...