`

sql server2008存储过程

阅读更多

存储过程:可以使得对的管理、以及显示关于及其用户信息的工作容易得多。存储过程是 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;

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics