建存储过:

建不参数的存储过

法:

CREATE PROC[EDURE] 储过程名

AS

SQL

C言的函数一,参数可

参数分为输入参数、出参数

入参数允有默认值

步骤

SQL句。

测试SQL句是否正确,并能实现功能要求。

③ 若得到的果数据符合期要求,按照存储过程的法,建存储过程。

储过程,验证其正确性。

DEMO1建一存储过程,要求储过程返回学生姓名、所学程名称和任

CREATE PROCEDURE proc_StuCouTea_name

AS

SELECT student_name,course_name,teacher_name

FROM student a,student_courseb,course c,teacher_course_classd,teacher e

WHERE a.student_id=b.student_id

AND b.course_id=c.course_id

AND c.course_id=d.course_id

AND d.teacher_id=e.teacher_id

--行以上脚本,便可建存储过proc_StuCouTea_name。如要储过程,可在查询分析器中

行如下句:

EXEC proc_StuCouTea_name

DEMO2建存储过proc_area,根据三角形三算三角形面

create procedure proc_area

as

declare @a float,@b float,@c float

declare @p float,@s float

select @a=2,@b=4,@c=5

print '入的三边为'+convert(varchar(5),@a)+''+convert(varchar(5),@b)+'

'+convert(varchar(5),@c)

if @a+@b>@c and @a+@c>@b and @b+@c>@a

begin

set @p=(@a+@b+@c)/2

set @s=sqrt(@p*(@p-@a)*(@p-@b)*(@p-@c))

print '三角形的面积为'+convert(varchar(8),@s)

end

else

print '入三不能构成一个三角形!'

exec proc_area

返回:

入的三边为245

三角形的面积为.79967

DEMO3建存储过程,算从1100相加的

create proc pr_sum

with encryption

as

declare @sum int, @count int

select @sum=0, @count=1

label_1:

select @sum=@sum+@count

select @count=@count+1

if @count<=100

goto label_1

select @count,@sum

exec pr_sum

建存储过程的注意事

个存储过应该完成一项单独的工作。

防止的用看到自己所写的存储过程的脚本,建存储过可以使用参数

WITH ENCRYPTION

③ 一般存储过程都是在服器上建和测试,在客机上使用还应该进测试

参数的存储过

们刚建的求三角形面的存储过proc_area:

储过程:exec proc_area

可以看出,存储过proc_area的功能就是边长为245的三角形的面。由于用无法参与程内运行的句,储过程只能行固定的操作,其用性大大降低了。带输入参数的存储过程允过输入参数,参与到程中行的命令中,我可以把句运行的关键值设置成入参数,由用用存储过程的候定义该值,从而达到控制存储过程功能的目的。

法:

createproc[edure] 储过程名

@parameter_namedataype[=default]

[,……]

as

DEMO1建立一个存储过程,选择某一个指定学生的学生姓名、所学程及任姓名。

CREATEPROCEDURE proc_StuCouTea_name@studentname varchar(8)

AS

SELECTstudent_name,

course_name,

teacher_name

FROMstudent a,

student_courseb,

coursec,

teacher_course_classd,

teachere

WHEREa.student_id=b.student_id

ANDb.course_id=c.course_id

ANDc.course_id=d.course_id

ANDd.teacher_id=e.teacher_id

ANDstudent_name=@studentname

可以运行下面的句来行它,以查询学生虹所学的程及程的任姓名:

EXECproc_StuCouTea_name ''

这种类型的存储过程存在的一个问题,如果用传递给该储过程所需参数中的任何一个,将会错误。解决这种问题的一方法是建立使用默认值的参数。要做到一点,用在参数的定之后加上等号,并在等号后面写出默认值。如将上例中入参数的定

@studentnamevarchar(8)

换为

@studentnamevarchar(8)='%'

重新建存储过spStuCouTea_withParam,如果储过不提供任何参数,则执行返回的果集将是空集,而不会错误

DEMO2修改才的算三角形面的存储过程,要求由用户输入三个边长算三角形面

createprocedure proc_area

@afloat,@b float,@c float

as

declare@p float,@s float

print'入的三边为'+convert(varchar(5),@a)+''+convert(varchar(5),@b)+'

'+convert(varchar(5),@c)

if @a+@b>@c and @a+@c>@b and @b+@c>@a

begin

set @p=(@a+@b+@c)/2

set @s=sqrt(@p*(@p-@a)*(@p-@b)*(@p-@c))

print'三角形的面积为'+convert(varchar(8),@s)

end

else

print'入三不能构成一个三角形!'

行:

execproc_area 3,3,4

返回:

入的三边为334

三角形的面积为.47214

DEMO3JWGL数据建立一个存储过程,通过执行存储过程将学生信息添加到student表。

CREATEPROCEDURE proc_AddStudent

@idchar(8)= NULL,

@namenvarchar(8)= NULL,

@sexchar(2)= NULL,

@birthdaysmalldatetime= NULL,

@classchar(6)= NULL,

@InDatesmalldatetime= NULL,

@homenvarchar(40)= NULL

AS

IF @id IS NULL

OR@name IS NULL

OR@sex IS NULL

OR@birthday IS NULL

OR@class IS NULL

OR@InDate is NULL

BEGIN

PRINT'重新学生信息!'

PRINT'你必提供学生的学号、姓名、性、出生日期、班号及入学日期。'

PRINT'(家庭地址可以空)'

RETURN

END

INSERTstudent

(student_id,

student_name,

sex,

birth,

class_id,

entrance_date,

home_addr)

VALUES

(@id,

@name,

@Sex,

@birthday,

@class,

@InDate,

@home)

PRINT'学生'+@name+'的信息成功添加到表student中。'

 

带输出参数存储过

法:

CREATEPROC[EDURE] 储过程名

@parameter_namedataype[=default] OUTPUT

[,……]

AS

其中:

OUTPUT:指明参数是一个出参数。是一个保留字,出参数必位于所有入参数之后。返回是当存储过行完成参数的当前了保存个返回,在该过SQL用脚本必使用OUTPUT关键字。

DEMO1建一个实现加法算并将运算果作为输出参数的存储过

CREATEPROCEDURE proc_Add

@Value1INT,

@Value2INT,

@ResultValueINT OUTPUT

AS

SELECT@ResultValue = @Value1 + @Value2

GO

 

若在存储过程的定中省略OUTPUT会出实际上,个存储过程的行,都将自返回一个返回状(可以通@return_status得),用于告诉调用程序储过程的状况用程序可根据返回状作相理。一般而言,系使用0表示储过

行成功。用也可以在存储过程中使用RETURN来返回指定的

DEMO2建存储过proc_area_circle的半径,,并通过该储过程,柱的体

createproc proc_area_circle

@rfloat=0,

@sfloat output

as

set @s=pi()*@r*@r

go

储过程:

declare@r float

declare@s float

set @r = 10

execproc_area_circle@r,@s output

printconvert(varchar(20),@s)

返回果:

314.159

储过程重编译

在某些情况下,可能需要改数据逻辑结构(如:表新增列),或者表新增索引。了使储过程能根据数据的改重新化,或从新的索引中受益,就要求SQLServer行存储过时对它重新编译,因除非重新启SQL Server,否,存储过访问数据表的原始查询不会自动优化。以下是重新编译储过程的三方法

① 在建存储过,使用CREATE PROCEDURE中的RECOMPILE编译选项

具体法如下:

CREATEPROCEDURE... [WITH RECOMPILE]

SQLServer对这个存储过程不重用查询计划,在都被重新编译,建新的查询计划。

DEMOJWGL数据库创建一个编译选项的存储过程,用于查询某学生的成信息。

CREATEPROC spStudentCourse@studentid char(8)

WITHRECOMPILE

AS

SELECT*

FROMstudent_course

wherestudent_id = @studentid

行存储过编译

EXECUTE句中使用WITH RECOMPILE选项SQL Server行一个存储过,重新编译该储过程。其法如下:

EXECUTEprocedure_name [parameter] [WITH RECOMPILE]

DEMO重新编译选项行存储过spAdd

--建存储过程:

CREATEPROCEDURE proc_Add

@Value1INT,

@Value2INT,

@ResultValueINT OUTPUT

AS

SELECT@ResultValue = @Value1 + @Value2

GO

--用存储过,使用recompile参数重编译该储过程:

DECLARE@ResultValue INT

EXECproc_add 4,9, @ResultValue OUTPUT

WITHRECOMPILE

PRINTCONVERT(CHAR(5), @ResultValue)

③ 使用sp_recompile储过程,指定表的存储过行重编译

法如下:

sp_recompiletable_name

例如:EXEC sp_recompile student student表的所有存储过程和触器在下一次运行被重新编译

 

动执行存储过

SQLServer 动时可以自动执行一个或多个存储过程。些存储过程必由系管理员创建,并在sysadmin固定服器角色下作后台行。程不能有任何入参数,也不能从程中返回任何果集。

使用系储过sp_procoption可以将有存储过动执程或停止自动执行,也可以SQL Server动时执行的所有程的列表。

法:

sp_procoption [ @ProcName = ] 'procedure' , [ @OptionName = ]

'option', [ @OptionValue = ] 'value'

其中:

[@ProcName =] 'procedure' :要置或选项程名。无默认值

[@OptionName =] 'option':要置的选项的名称。option的唯一startup

该值设置存储过程的自动执行状

[ @OptionValue = ] 'value':表示选项为开trueonfalseoff)。无默认值