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

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

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

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

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

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

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

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

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

以stuinfo表为例子:

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

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

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

以stuinfo表为例子:

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

调用:

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

eg3:参数传递方式:

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

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

 1 select * from stuinfo
 2   select * from stuinfobak1
 3  drop table stuinfobak1
 4  select * into stuDB.dbo.stuinfobak1 from stuinfo
 5 go
 6     create proc ReturnValue
 7    @返回值1 varchar(20) output
 8   as
 9    begin
10     declare @返回值2 int
11     declare @stuID库数 int
12     select @stuID库数=Count(distinct stuID) from stuinfo
13
14     set @返回值1 = ‘‘ + cast(@stuID库数 as varchar(10))
15     select @返回值2=Count(distinct stuID) from stuinfo
16     return @返回值2
17   end
18   go
19   declare @接收值1 varchar(20)
20   declare @接收值2 int
21   exec @接收值2=ReturnValue @接收值1 output
22   print @接收值1
23   print @接收值2
24
25 go
26 alter proc ReturnValue
27    @返回值1 varchar(20) output
28   as
29    begin
30     declare @返回值2 int
31     declare @stuID库数 int
32     select @stuID库数=Count(distinct stuID) from stuinfo
33
34     set @返回值1 = ‘----‘ + cast(@stuID库数 as varchar(10))
35     select @返回值2=Count(distinct stuID) from stuinfo
36     return @返回值2
37   end
38   go
39   declare @接收值1 varchar(20)
40   declare @接收值2 int
41   exec @接收值2=ReturnValue @接收值1 output
42   print @接收值1
43   print @接收值2  

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

 1 create proc UseCursor
 2     @cursor cursor Varying output
 3    as
 4     begin
 5      set @cursor=Cursor forward_only static for
 6      select top 10 * from 订单
 7      open @cursor
 8     end
 9    declare @my_cursor cursor
10    declare @订单号 varchar(20)
11    declare @供应商号 varchar(20)
12    declare @职工号 varchar(20)
13    declare @订单日期 varchar(30)
14    exec UseCursor @my_cursor output
15    fetch next from @my_cursor
16     into @职工号,@订单号,@供应商号,@订单日期
17     while @@fetch_status=0
18      begin
19       print @订单号 + ‘ -- ‘ + @订单日期
20       fetch next from @my_cursor
21        into @职工号,@订单号,@供应商号,@订单日期
22      end  
时间: 2024-10-18 23:57:17

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

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

存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的编程功能.存储过程可包含程序流.逻辑以及对数据库的查询.它们可以接受参数.输出参数.返回单个或多个结果集以及返回值. 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 1.可以在单个存储过程中执

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

存储过程:     存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的编程功能.存储过程可包含程序流.逻辑以及对数据库的查询.它们可以接受参数.输出参数.返回单个或多个结果集以及返回值. 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 1.可以在单个存储过程中执

SQL中存储过程与自定义函数的区别

存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 优点 ①重复使用.存储过程可以重复使用,从而可以减少数据库开发人员的工作量. ②提高性能.存储过程在创建的时候在进行了编译,将来使用的时候不再重新翻译.一般的SQL语句每

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

Sqlserver中存储过程,触发器,自定义函数: 自定义函数:1.函数类型:2.函数的参数和返回值: 1.函数类型:标量值函数,返回的是一个标量值表值函数:内联表值函数:多语句表值函数. 标量值函数: 1 go 2 create function SumOrders(@职工号 varchar(20))--指定参数名,和返回类型 stuNo 3 returns int --指定返回类型 4 begin 5 declare @订单总数 int --学生人数sumstudent 6 select @

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

Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的存储过程,Insert,Update,Delete After触发器:记录被改变之后激活执行 Instead of触发器:记录被改变之前激活执行. DDL触发器:响应数据定义语言执行时触发执行的存储过程,一般用于执行数据库中的管理任务 审核和规范数据库的操作: 防止数据表结构被更改或删除 2. ht

转:存储过程和自定义函数的区别

首先来看一下存储过程和自定义函数的概念 一. 什么是存储过程? 存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理. 存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.有条件执行以及其它强大的编程功能. 存储过程可包含程序流.逻辑以及对数据库的查询.它们可以接受参数.输出参数. 返回单个或多个结果集以及返回值. 可以出于任何使用SQL 语句的目的来使用存储过程

存储过程和自定义函数的区别

1: 1)存储过程,功能强大,可以执行包括修改表等一系列数据库操作,也可以创建为 SQL Server 启动时自动运行的存储过程. 自定义函数,用户定义函数不能用于执行一组修改全局数据库状态的操作. 2)存储过程,可以使用非确定函数. 自定义函数,不允许在用户定义函数主体中内置非确定函数. 3)存储过程,主要是返回一个int状态结果,也可返回记录集. 自定义函数,可以返回表变量. 关于这个,很容易糊涂.存储过程,可以使用这样的形式来返回N多的结果: create procedure sp1  a

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

语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) [ characteristics..] routime_body 其中: proc_parameter : [IN|OUT|INOUT] parameter_name type 其中IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出:param_name

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

一.SqlServer 中 1. 创建表 create table testuser( id int, --primary key, names varchar(50), address varchar(50), paw varchar(50) ) 2.创建存储过程 create proc testp12(@id int ,@names varchar(50),@address varchar(50),@paw varchar(50)) as begin declare @maxid int i