-- 创建存储过程DELIMITER $ --声明存储过程的结束符
CREATE PROCEDURE stu_test() --存储过程名称(参数列表)
BEGIN --开始 -- 可以写多个sql语句 -- sql语句+流程控制
END $ --结束 结束符
-- 执行存储过程call stu_test() --call 存储过程名称(参数)
参数:IN: 表示输入参数,可以携带数据带存储过程中
OUT: 表示输出参数,可以从存储过程中返回结果
INOUT: 表示输入输出参数,两者结合
Ⅱ sqlserver怎么创建存储过程
什么是存储过程?
q 存储过程(procere)类似于C语言中的函数
q 用来执行管理任务或应用复杂的业务规则
q 存储过程可以带参数,也可以返回结果
q 存储过程可以包含数据操纵语句、变量、逻辑 控制语句等
存储过程的优点
(1)执行速度快。
存储过程创建是就已经通过语法检查和性能优化,在执行时无需每次编译。
存储在数据库服务器,性能高。
(2)允许模块化设计。
只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员创建,并可独立于程序源代码而单独修改 。
(3)提高系统安全性。
可将存储过程作为用户存取数据的管道。可以限制用户对数据表的存取权限,建立特定的存储过程供用户使用,完成对数据的访问。
存储过程的定义文本可以被加密,使用户不能查看其内容。
(4)减少网络流量:
一个需要数百行Transact-SQL代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。
存储过程的分类
q 系统存储过程
q 由系统定义,存放在master数据库中
q 类似C语言中的系统函数
q 系统存储过程的名称都以“sp_”开头或”xp_”开头
q 用户自定义存储过程
q 由用户在自己的数据库中创建的存储过程
q 类似C语言中的用户自定义函数
常用的系统存储过程
系统存储过程
说明
sp_databases
列出服务器上的所有数据库。
sp_helpdb
报告有关指定数据库或所有数据库的信息
sp_renamedb
更改数据库的名称
sp_tables
返回当前环境下可查询的对象的列表
sp_columns
回某个表列的信息
sp_help
查看某个表的所有信息
sp_helpconstraint
查看某个表的约束
sp_helpindex
查看某个表的索引
sp_stored_proceres
列出当前环境中的所有存储过程。
sp_password
添加或修改登录帐户的密码。
sp_helptext
显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本。
EXEC sp_databases /*列出当前系统中的数据库*/
EXEC sp_renamedb 'Northwind','Northwind1' /*修改数据库的名称(单用户访问, 最简单的办法就是执行SQL语句时关掉企业管理器)*/
USE stuDB
GO
EXEC sp_tables /*当前数据库中查询的对象的列表*/
EXEC sp_columns stuInfo /*返回某个表列的信息*/
EXEC sp_help stuInfo /*查看表stuInfo的信息*/
EXEC sp_helpconstraint stuInfo /*查看表stuInfo的约束*/
EXEC sp_helpindex stuMarks /*查看表stuMarks的索引*/
EXEC sp_helptext 'view_stuInfo_stuMarks' /*查看视图的语句文本*/
EXEC sp_stored_proceres /*查看当前数据库中的存储过程*/
常用的扩展存储过程
q 常用的扩展存储过程:xp_cmdshell
q 可以执行DOS命令下的一些的操作
q 以文本行方式返回任何输出
q 调用语法:
q EXEC xp_cmdshell DOS命令 [NO_OUTPUT]
USE master
GO
EXEC xp_cmdshell 'mkdir d:/bank', NO_OUTPUT /*创建文件夹D:/bank*/
IF EXISTS(SELECT * FROM sysdatabases
WHERE name='bankDB')
DROP DATABASE bankDB
GO
CREATE DATABASE bankDB
(
…
)
GO
EXEC xp_cmdshell 'dir D:/bank/' --查看文件 /*查看文件夹D:/bank*/
如何创建存储过程?
q 定义存储过程的语法
CREATE PROC[EDURE] 存储过程名
@参数1 数据类型 = 默认值,
…… ,
@参数n 数据类型 OUTPUT
AS
SQL语句
GO
q 和C语言的函数一样,参数可选
q 参数分为输入参数、输出参数
q 输入参数允许有默认值
创建不带参数的存储过程
CREATE PROCEDURE proc_stu /* proc_stu为存储过程的名称*/
AS
DECLARE @writtenAvg float,@labAvg float /* 笔试平均分和机试平均分变量 */
SELECT @writtenAvg=AVG(writtenExam),
@labAvg=AVG(labExam) FROM stuMarks
print '笔试平均分:'+convert(varchar(5),@writtenAvg)
print '机试平均分:'+convert(varchar(5),@labAvg)
IF (@writtenAvg>70 AND @labAvg>70)
print '本班考试成绩:优秀' /* 显示考试成绩的等级 */
ELSE
print '本班考试成绩:较差'
print '--------------------------------------------------'
print ' 参加本次考试没有通过的学员:'
SELECT stuName,stuInfo.stuNo,writtenExam,labExam /* 显示未通过的学员 */
FROM stuInfo INNER JOIN stuMarks ON
stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<60 OR labExam<60
GO
调用存储过程
q EXECUTE(执行)语句用来调用存储过程
q 调用的语法
EXEC 过程名 [参数]
创建带参数的存储过程
q 存储过程的参数分两种:
q 输入参数
q 输出参数
q 输入参数:
用于向存储过程传入值,类似C语言的按值传递;
q 输出参数:
用于在调用存储过程后,
返回结果,类似C语言的
按引用传递;
带输入参数的存储过程
问题:
修改上例:由于每次考试的难易程度不一样,每次 笔试和机试的及格线可能随时变化(不再是60分),这导致考试的评判结果也相应变化。
分析:
在述存储过程添加2个输入参数:
@writtenPass 笔试及格线
@labPass 机试及格线
CREATE PROCEDURE proc_stu
@writtenPass int = 60, /*输入参数:笔试及格线*/
@labPass int = 60 /*输入参数:机试及格线*/
AS
print '--------------------------------------------------'
print ' 参加本次考试没有通过的学员:'
SELECT stuName,stuInfo.stuNo,writtenExam, /*查询没有通过考试的学员*/
labExam FROM stuInfo
INNER JOIN stuMarks ON
stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<@writtenPass
OR labExam<@labPass
GO
q 调用带参数的存储过程
假定本次考试机试偏难,机试的及格线定为55分,笔试及格线定为60分
EXEC proc_stu 60,55
--或这样调用:
EXEC proc_stu @labPass=55,@writtenPass=60
带输出参数的存储过程
q 如果希望调用存储过程后,返回一个或多个值,这时就需要使用输出(OUTPUT)参数了
问题:
修改上例,返回未通过考试的学员人数。
CREATE PROCEDURE proc_stu
@notpassSum int OUTPUT, /*输出(返回)参数:表示没有通过的人数*/
@writtenPass int=60, /*推荐将默认参数放在最后*/
@labPass int=60
AS
……
SELECT stuName,stuInfo.stuNo,writtenExam, /*统计并返回没有通过考试的学员人数*/
labExam FROM stuInfo INNER JOIN stuMarks
ON stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam<@writtenPass
OR labExam<@labPass
SELECT @notpassSum=COUNT(stuNo)
FROM stuMarks WHERE writtenExam<@writtenPass
OR labExam<@labPass
GO
q 调用带输出参数的存储过程
/*---调用存储过程----*/
DECLARE @sum int /*调用时必须带OUTPUT关键字 ,返回结果将存放在变量@sum中*/
EXEC proc_stu @sum OUTPUT ,64
print '--------------------------------------------------'
IF @sum>=3 /*后续语句引用返回结果*/
print '未通过人数:'+convert(varchar(5),@sum)+ '人,
超过60%,及格分数线还应下调'
ELSE
print '未通过人数:'+convert(varchar(5),@sum)+ '人,
已控制在60%以下,及格分数线适中'
GO
注意:调用时也必须跟随关键字OUTPUT,否则SQL Server将视为输入参数。
处理存储过程中的错误
q 可以使用PRINT语句显示错误信息,但这 些信息是临时的,只能显示给用户
q RAISERROR 显示用户定义的错误信息时
q 可指定严重级别,
q 设置系统变量@@ERROR
q 记录所发生的错误等
q RAISERROR语句的用法如下:
RAISERROR (msg_id | msg_str,severity,
state WITH option[,...n]])
• msg_id:在sysmessages系统表中指定用户定义错误信息
• msg_str:用户定义的特定信息,最长255个字符
• severity:定义严重性级别。用户可使用的级别为0–18级
• state:表示错误的状态,1至127之间的值
• option:指示是否将错误记录到服务器错误日志中
RAISERROR 语句每个参数的详细讲解,可以查阅SQL帮助!
问题:
完善上例,当用户调用存储过程时,传入的及格线参数不
在0~100之间时,将弹出错误警告,终止存储过程的执行。
CREATE PROCEDURE proc_stu
@notpassSum int OUTPUT, --输出参数
@writtenPass int=60, --默认参数放后
@labPass int=60 --默认参数放后
AS
IF (NOT @writtenPass BETWEEN 0 AND 100)
OR (NOT @labPass BETWEEN 0 AND 100)
/*引发系统错误,指定错误的严重级别16,调用状态为1(默认),并影响@@ERROR系统变量的值 */
BEGIN
RAISERROR (‘及格线错误,请指定0-100之间的分
数,统计中断退出',16,1)
RETURN ---立即返回,退出存储过程
END
…..其他语句同上例,略
GO
/*---调用存储过程,测试RAISERROR语句----*/
DECLARE @sum int, @t int
EXEC proc_stu @sum OUTPUT ,604 /*笔试及格线误输入604分*/
SET @t=@@ERROR
print '错误号:'+convert(varchar(5),@t )
IF @t<>0 /*如果执行了RAISERROR,系统全局@@ERROR将不等于0,表示出现错误*/
RETURN --退出批处理,后续语句不再执行
print '--------------------------------------------------'
IF @sum>=3
print '未通过人数:'+convert(varchar(5),@sum)+ '人,超过60%,及格分数线还应下调'
ELSE
print '未通过人数:'+convert(varchar(5),@sum)+ '人,已控制在60%以下,及格分数线适中'
GO
好,我们来做个总结:
• 存储过程是一组预编译的SQL语句,它可以包含数据操纵语句、变量、逻辑控制语句等
• 存储过程允许带参数,参数分为:
– 输入参数
– 输出参数
其中,输入参数可以有默认值。
• 输入参数:可以在调用时向存储过程传递参数,此类参数可用来向存储过程中传入值
• 输出参数从存储过程中返回(输出)值,后面跟随OUTPUT关键字
• RAISERROR语句用来向用户报告错误
Ⅲ 创建存储过程sql语句
1)过程名
存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即db_name.sp_name。
需要注意的是,名称应当尽量避免选取与MySQL内置函数相同的名称,否则会发生错误。
2)过程参数
存储过程的参数列表。其中,<参数名>为参数名,<类型>为参数的类型(可以是任何有效的MySQL数据类型)。当有多个参数时,参数列表中彼此间用逗号分隔。存储过程可以没有参数(此时存储过程的名称后仍需加上一对括号),也可以有1个或多个参数。
MySQL存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用IN、OUT和INOUT三个关键字标识。其中,输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。
Ⅳ sqlserver怎么创建存储过程
第一步:点击数据库下的“可编程性”,选择“存储过程”,点击鼠标右键,选择“新建存储过程”
注意事项:
注意执行exec时,参数的类型,要与建立的存储过程时设置的参数类型一致。
Ⅳ sqlserver怎么创建存储过程
1、可视化创建
a.登录SQL Server
b.打开数据库==》要创建存储过程的数据库==》可编程性==》存储过程
c.选中“存储过程”右击 ,在系出现的对话框中选择“新建存储过程”
d.在右侧出现的对话框中填写具体存储过程内容完成后执行即可
2、代码创建
a.全手写代码
一、定义变量
--简单赋值
declare@aint
set@a=5
print@a
--使用select语句赋值
declare@user1nvarchar(50)
select@user1='张三'
print@user1
declare@user2nvarchar(50)
select@user2=NamefromST_UserwhereID=1
print@user2
--使用update语句赋值
declare@user3nvarchar(50)
updateST_Userset@user3=NamewhereID=1
print@user3
二、表、临时表、表变量
--创建临时表1
createtable#DU_User1
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL
);
--向临时表1插入一条记录
insertinto#DU_User1(ID,Oid,[Login],Rtx,Name,[Password],State)values(100,2,'LS','0000','临时','321','特殊');
--从ST_User查询数据,填充至新生成的临时表
select*into#DU_User2fromST_UserwhereID<8
--查询并联合两临时表
select*from#DU_User2whereID<3unionselect*from#DU_User1
--删除两临时表
droptable#DU_User1
droptable#DU_User2
--创建临时表
CREATETABLE#t
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL,
)
--将查询结果集(多条数据)插入临时表
insertinto#tselect*fromST_User
--不能这样插入
--select*into#tfromdbo.ST_User
--添加一列,为int型自增长子段
altertable#tadd[myid]intNOTNULLIDENTITY(1,1)
--添加一列,默认填充全球唯一标识
altertable#tadd[myid1](newid())
select*from#t
droptable#t
--给查询结果集增加自增长列
--无主键时:
selectIDENTITY(int,1,1)asID,Name,[Login],[Password]into#tfromST_User
select*from#t
--有主键时:
select(selectSUM(1)fromST_UserwhereID<=a.ID)asmyID,*fromST_UseraorderbymyID
--定义表变量
declare@ttable
(
idintnotnull,
msgnvarchar(50)null
)
insertinto@tvalues(1,'1')
insertinto@tvalues(2,'2')
select*from@t
三、循环
--while循环计算1到100的和
declare@aint
declare@sumint
set@a=1
set@sum=0
while@a<=100
begin
set@sum+=@a
set@a+=1
end
print@sum
四、条件语句
--if,else条件分支
if(1+1=2)
begin
print'对'
end
else
begin
print'错'
end
--whenthen条件分支
declare@todayint
declare@weeknvarchar(3)
set@today=3
set@week=case
when@today=1then'星期一'
when@today=2then'星期二'
when@today=3then'星期三'
when@today=4then'星期四'
when@today=5then'星期五'
when@today=6then'星期六'
when@today=7then'星期日'
else'值错误'
end
print@week
五、游标
declare@IDint
declare@Oidint
declare@Loginvarchar(50)
--定义一个游标
declareuser_curcursorforselectID,Oid,[Login]fromST_User
--打开游标
openuser_cur
while@@fetch_status=0
begin
--读取游标
fetchnextfromuser_curinto@ID,@Oid,@Login
print@ID
--print@Login
end
closeuser_cur
--摧毁游标
deallocateuser_cur
六、触发器
触发器中的临时表:
Inserted
存放进行insert和update操作后的数据
Deleted
存放进行delete和update操作前的数据
--创建触发器
CreatetriggerUser_OnUpdate
OnST_User
forUpdate
As
declare@msgnvarchar(50)
--@msg记录修改情况
select@msg=N'姓名从“'+Deleted.Name+N'”修改为“'+Inserted.Name+'”'fromInserted,Deleted
--插入日志表
insertinto[LOG](MSG)values(@msg)
--删除触发器
droptriggerUser_OnUpdate
七、存储过程
--创建带output参数的存储过程
CREATEPROCEDUREPR_Sum
@aint,
@bint,
@sumintoutput
AS
BEGIN
set@sum=@a+@b
END
--创建Return返回值存储过程
CREATEPROCEDUREPR_Sum2
@aint,
@bint
AS
BEGIN
Return@a+@b
END
--执行存储过程获取output型返回值
declare@mysumint
executePR_Sum1,2,@mysumoutput
print@mysum
--执行存储过程获取Return型返回值
declare@mysum2int
execute@mysum2=PR_Sum21,2
print@mysum2八、自定义函数
函数的分类:
1)标量值函数
2)表值函数
a:内联表值函数
b:多语句表值函数
3)系统函数--新建标量值函数
createfunctionFUNC_Sum1
(
@aint,
@bint
)
returnsint
as
begin
return@a+@b
end
--新建内联表值函数
createfunctionFUNC_UserTab_1
(
@myIdint
)
returnstable
as
return(select*fromST_UserwhereID<@myId)
--新建多语句表值函数
createfunctionFUNC_UserTab_2
(
@myIdint
)
returns@ttable
(
[ID][int]NOTNULL,
[Oid][int]NOTNULL,
[Login][nvarchar](50)NOTNULL,
[Rtx][nvarchar](4)NOTNULL,
[Name][nvarchar](5)NOTNULL,
[Password][nvarchar](max)NULL,
[State][nvarchar](8)NOTNULL
)
as
begin
insertinto@tselect*fromST_UserwhereID<@myId
return
end
--调用表值函数
select*fromdbo.FUNC_UserTab_1(15)
--调用标量值函数
declare@sint
set@s=dbo.FUNC_Sum1(100,50)
print@s
--删除标量值函数
dropfunctionFUNC_Sum1
谈谈自定义函数与存储过程的区别:
一、自定义函数:
1.可以返回表变量
2.限制颇多,包括
不能使用output参数;
不能用临时表;
函数内部的操作不能影响到外部环境;
不能通过select返回结果集;
不能update,delete,数据库表;
3.必须return一个标量值或表变量
自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
二、存储过程
1.不能返回表变量
2.限制少,可以执行对数据库表的操作,可以返回数据集
3.可以return一个标量值,也可以省略return
存储过程一般用在实现复杂的功能,数据操纵方面。
Ⅵ sql server中怎样用代码创建存储过程
打开SQL server management studio,连接到数据库,展开想要创建的数据库,找到【可编程性】->【存储过程】的菜单
Ⅶ 在MySQL中如何创建一个带输出参数为一个表类型的存储过程
在MySQL中如何创建一个带输出参数为一个表类型的存储过程
首先需要知道“另一个存储过程”的结果集的所有列的类型。
假设“另一个存储过程”的名字是sp1,没有参数,返回的结果集共3列,全部为int型,那么“存储过程”里添加一个与结果集列数相同的临时表或表变量用于接收“另一个存储过程”的结果集
如下
CREATE
PROCEDURE
sp2
AS
DECLARE
@t
table(a
int,b
int,c
int)
INSERT
INTO
@t(a,b,c)
EXEC
sp1
SELECT
*
FROM
@t
使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用。
创建存储过程
和数据表一样,在使用之前需要创建存储过程,它的简明语法是:
引用:
Create
PROC
存储过程名称
[参数列表(多个以“,”分隔)]
AS
SQL
语句
例:
引用:
Create
PROC
upGetUserName
@intUserId
INT,
@ostrUserName
NVARCHAR(20)
OUTPUT
--
要输出的参数
AS
BEGIN
--
将uName的值赋给
@ostrUserName
变量,即要输出的参数
Select
@ostrUserName=uName
FROM
uUser
Where
uId=@intUserId
END
其中
Create
PROC
语句(完整语句为Create
PROCEDURE)的意思就是告诉SQL
SERVER,现在需要建立一个存储过程,upGetUserName
就是存储过程名称,@intUserId
和
@ostrUserName
分别是该存储过程的两个参数,注意,在SQL
SERVER中,所有用户定义的变量都以“@”开头,OUTPUT关键字表示这个参数是用来输出的,AS之后就是存储过程内容了。只要将以上代码在“查询分析器”里执行一次,SQL
SERVER就会在当前数据库中创建一个名为“upGetUserName”的存储过程。你可以打开“企业管理器”,选择当前操作的数据库,然后在左边的树型列表中选择“存储过程”,此时就可以在右边的列表中看到你刚刚创建的存储过程了(如果没有,刷新一下即可)。
二、存储过程的调用
之前已经创建了一个名为“upGetUserName”的存储过程,从字面理解该存储过程的功能是用来取得某一个用户的名称。存储过程建立好了,接下来就是要在应用程序里调用了,下面看一下在ASP程序里的调用。