sql server 数据库存储过程

最近由于工作原因使用到MS-SQLSERVER,发现之前的东西大多已经忘记,为了加强记忆,特总结MS-SQLSERVER的一些知识在最近几篇文中:

存储过程定义:

     存储过程是用户为了完成某些特定功能定义的一块SQL程序集合,类似于C++中的函数;存储过程在编译后存储在数据库中。用户通过存储过程名和设定参数调用存储过程。

存储过程与触发器、函数的区别:

    存储过程就像是数据库中的全局函数,能够被用户调用,能够操作每张表,能够调用存储过程和函数,同时能够输入和返回多个参数。触发器是对于特定表的特定操作的,这点从触发器的创建就可以看出:CREATE TIGGER [tigger_Name] ON [table_name]……;数据库中的函数不能够返回参数只能返回表对象或者值,另外函数可以使用在查询语句中。

创建、修改、执行存储过程:

    创建存储过程:

CREATE PROC proc_name
@parm1,
@parm2,
...
@parmOut1 output,
...
as
begin
...
end

修改存储过程只需要将上面代码中的CREATE修改为ALTER就可以。
执行存储过程的语句为exec proc_name {参数表};

向存储过程传递数据集:  
  MS-SQL并没有提供向proc中传递数据集的功能,如果要向存储过程中传递一组数据,一般的方法是将数据拼接成字符串,然后在存储过程中将字符串参数通过函数CHARINDEX()和SUBSTRING()拆分为单个的数据,由于数据库中没有数组的概念,拆分后的数据要存储在临时表中,创建临时表跟普通的表一样,只是要在表名称中加上'#'或者‘##’,‘#’表示局部临时表,‘##’表示全局临时表。   另外,也可以通过对XML文件的操作来传递数据集,具体参见MS-SQLSERVER的帮助文档。

如下:

declare @prePos int;
declare @curPos int;
declare @price varchar(30);
declare @detail_id varchar(10);
declare @idPos int;
set @prePos = 1;
set @curPos = 1;
set @idPos  = 1;
		
create table #tb_price(id int not null, AcceptPrice dec(20, 7));
while(@prePos < LEN(@priceAll))
begin
	    set @curPos = CHARINDEX(';', @priceAll, @prePos);
	    set @idPos  = CHARINDEX(',', @priceAll, @prePos);
	    if @curPos > 0
		begin
		    set @price = SUBSTRING(@priceAll, @idPos + 1, @curPos - @idPos - 1);
		    set @detail_id = SUBSTRING(@priceAll, @prePos, @idPos - @prePos);
				
		    Insert into #tb_price
		    values(CONVERT(INT, @detail_id) ,CONVERT(dec(20, 7), @price));
				
		    set @prePos = @curPos + 1;
		end
		else
		    break;
end


存储过程和事务   
 事务:事务具有原子性、唯一性、隔离性和持久性的特点。而存储过程一般为多个语句的集合,一般要保证整个存储过程的可靠性和整个程序的完整性,而在程序中添加事务。一般情况下,在begin tran语句前添加set xact_abort on或者set xact_abort off,语句来设定事务的错误回滚(set xact_abort on表示错误回滚整条语句,set xact_abort off表示错误时回滚错误语句)。

猜你喜欢

转载自blog.csdn.net/ghy429090/article/details/39430481