存储过程:可以使得对的管理、以及显示关于及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:
(1)功能强大,限制少。
(2)可以在单个存储过程中执行一系列 SQL 语句。
(3)可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
(4)存储过程在创建时即在上进行编译,所以执行起来比单个 SQL 语句快。
(5)可以有多个返回值,即多个输出参数,并且可以使用SELECT返回结果集。
函数:是由一个或多个 SQL 语句组成的子程序,可用于封装代码以便重新使用。自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的操作。
复杂存储过程示例:
以下是复制具有关联关系的多张数据表的存储过程使用方法
--存储过程(在创建之前,首先删除该存储过程)
/*
use test
go
drop proc updAndInsertTableDataValue;
1、根据某表的id号,获取表信息然后插入一条新纪录并标记为新,更改之前的为旧
2、根据给定表id获取该表下所有数据项,然后循环,并进行复制
3、在表项的循环复制中,又进行该表项下的评价信息的检索和复制
*/
use TEST
go
create PROCEDURE updAndInsertTableDataValue
@tableId int
as
declare @tName varchar(100),@tUser int,@tState int,@tType int,@tDepType int,@tDepId int,@tUrl varchar(50),@tGType int,@tValidity date
declare @newTableId int,@newDataId int
--根据表的id号获取表信息,然后赋值
select @tName=tableListName,@tUser=createUser,@tState=tableListState,@tType=tableType,@tDepType=tableDepType,@tDepId=departId
,@tUrl=tableImgUrl,@tGType=gradeType,@tValidity=validity
from CW_SELF_TABLE_LIST where tableListId=@tableId;
--将值插入到表中,新增一条信息
insert
into CW_SELF_TABLE_LIST(createDate,createUser,tableListName,tableListState,tableImgUrl,tableType,tableDepType,departId,tableMark,gradeType,validity)
values(CURRENT_TIMESTAMP,@tUser,@tName+'('+CONVERT(varchar(100), GETDATE(), 23)+')' ,@tState,@tUrl,@tType,@tDepType,@tDepId,1,@tGType,@tValidity);
--将新生成的信息的主键赋值给变量
set @newTableId = @@identity
--将原来的信息改为陈旧信息
update CW_SELF_TABLE_LIST set tableMark=0 where tableListId=@tableId;
--******循环该表的数据项,然后将该数据项赋值**********
declare tableDataCursor cursor
for select tableDataId,orderId,tableDataIntro,tableDataName,tableDataState,tableDataType
from CW_SELF_TABLE_DATA where tableListId=@tableId;
--开启游标
open tableDataCursor
DECLARE @dataId int,@dOrder int,@dIntro varchar(150),@dName varchar(150),@dState int,@dType varchar(100)
FETCH NEXT FROM tableDataCursor INTO @dataId,@dOrder,@dIntro,@dName,@dState,@dType
while(@@FETCH_STATUS<>-1)
begin
if(@@FETCH_STATUS<>-2)
begin
--将值插入到tableData表中
insert into CW_SELF_TABLE_DATA(createDate,orderId,tableDataIntro,tableDataName,tableDataState,tableDataType,tableListId)
values(CURRENT_TIMESTAMP,@dOrder,@dIntro,@dName,@dState,@dType,@newTableId)
--将新的数据项id的值赋给变量
set @newDataId = @@IDENTITY
--***********开始循环数据项中的数据值************
declare tableValueCursor cursor
for select orderId,tableState,tableValueIntro,tableValueName
from cw_self_table_value where tableDataId=@dataId
open tableValueCursor
declare @vOrder int ,@vState int ,@vIntro varchar(255),@vName varchar(50)
fetch next from tableValueCursor into @vOrder,@vState,@vIntro,@vName
while(@@FETCH_STATUS<>-1)
begin
if(@@FETCH_STATUS<>-2)
begin
insert into CW_SELF_TABLE_VALUE(createDate,orderId,tableState,tableValueIntro,tableValueName,tableDataId)
values(CURRENT_TIMESTAMP,@vOrder,@vState,@vIntro,@vName,@newDataId)
end
fetch next from tableValueCursor into @vOrder,@vState,@vIntro,@vName
end
close tableValueCursor
deallocate tableValueCursor
end
FETCH NEXT FROM tableDataCursor INTO @dataId,@dOrder,@dIntro,@dName,@dState,@dType
end
close tableDataCursor
deallocate tableDataCursor
return @newTableId
go
--exec updAndInsertTableDataValue 15;