当前位置:首页 > 开发 > 数据库 > 正文

sql server2008存储过程

发表于: 2014-03-14   作者:补耍狠   来源:转载   浏览:
摘要: 存储过程:可以使得对的管理、以及显示关于及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。   

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

 

sql server2008存储过程

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
写过一篇存储过程入门的博客,那仅仅是入门,下面和大家一起深入学习存储过程(也许以后还会有更深
写过一篇存储过程入门的博客,那仅仅是入门,下面和大家一起深入学习存储过程(也许以后还会有更深
写过一篇存储过程入门的博客,那仅仅是入门,下面和大家一起深入学习存储过程(也许以后还会有更深
<!-- [if !mso]> <style> v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#de
SQL Server 2008 连载之存储结构—— 聚集索引 聚集索引即基于数据行的键值在表内排序和存储这些数
这几天在完善UML几种图,第一次画的很泛泛,而且缺少很多东西,比如用例的说明、注释,各种关系的认
SQL Server2008存储结构之对象存储视图 原稿首发于it168,链接为http://tech.it168.com/a2010/0915/
SQL Server2008存储结构之对象存储视图 原稿首发于it168,链接为http://tech.it168.com/a2010/0915/
<!-- [if !mso]> <style> v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#de
聚集索引即基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号