存储过程
存储过程分为系统存储过程和自定义存储过程
存储过程通过将处理数据的程序从客户端应用程序移动到服务器,存储过程是放在服务器上的,通过客户端下达指令调用存储过程的时候,
这个过程是在服务器上发生的,自然就不会占用网络的带宽就会降低网络流量。存储过程就是一组为了完成特定功能的T-SQL语句。就是一组语句随时随地拿出来调用。
经过编译后,它存储在SQLserver服务器端的数据库中,换句话说这个T-SQL语句不是普通的T-SQL语句,是经过编译的,存储在服务器中,它是有名称的,根据名称调用存储过程,
并进行相应的操作,与函数有些相似,但不同。利用存储过程可以加速T-SQL语句的执行。
系统存储过程在SQLserver安装之后就以及存储在SQLserver的master数据库中(master数据库里面存储了所有的系统存储过程。在新建数据库的时候它们自动的将这些存储过程赋值到新的数据库中)
也就是说创建一个新的数据库存储过程自然就存在了。所有的系统存储过程自然就存在了。系统存储过程是以sp开头的。
存储过程通常命名 (附加数据库需要先进行分离,分离后才可继续附加,或者附加的数据库是系统所没有的。)
sp_attach_db 附加数据库 exec sp_attach_db @dbname='newlts',@filename1='D:具体存储路径' \分离数据库''括号里为数据库名称
sp_detach_db 分离数据库 exec sp_detach_db 'newlts' \分离数据库''括号里为数据库名称 exec sp_renamedb test,test1 \给数据库进行改名,test改成test1
sp_rename 给对象改名 存储过程是可以有参数的,也可以有返回值的,但和函数并不相同,函数的返回值可以直接调用和赋值。存储过程的返回值只能指明执行是否成功,并且不像函数那样可以直接调用
sp_help 显示数据库相关数据 存储过程和函数的概念,过程可以执行操作,但没有返回值。 !!!!!!!存储过程的返回值就是指明执行是否成功。
sp_changedbowner 改变数据库所有者 存储过程的优点:
在SQLserver中T-sql可以判做是一种主编程语言,利用它来编程有两种方式:一、在本地存储T-sql程序并创建应用程序,向SQLserver发送命令。
Exec sp_changedbowner '所有者'
二、编写存储过程,并把它存储在SQLserver的服务器上,接下来来创建应用程序,来调用存储过程对结果进行处理。
sp_password 改密码
存储过程的四大优点:一、提高应用程序的通用性和可移植性,存储过程创建后可以在程序中被多次调用,类似于函数一样。应用程序是调用的存储过程,
Exec sp_password 旧密码 新密码 登录名 如果改相应的程序功能,存储过程可以随时修改,应用程序不用改。
二、可以更有效的管理用户的权限,有些用户可以调用存储过程,可以执行某些操作,某些用户不能执行某些操作,则不能调用存储过程
use LtsDatabase \获得数据库使用权限
系统管理员可以通过对执行某一操作的这样的存储过程它的调用权限进行限制,从而限制相应的数据哪些用户可以访问,哪些用户不可以访问,
exec sp_raname '网站职员表','新网站职员表' \为表进行改名。
这样一来就实现了对相应数据访问的控制。避免非授权用户进行操作
三、可以提高T-SQL语句的速度,存储过程本身是被编译过的,如果某一操作包含了大量的T-SQL代码,而且要被执行多次,这个时候就比较适合存储过程
因为存储过程是放在服务器端的,使用存储过程比直接调用T-SQL语句要快得多,因为是被编译过的
四、减轻网络负担、
存储过程的创建(自定义存储过程的创建)
过程名称 创建存储过程的格式 !!!(函数的返回值可以被调用,存储过程的返回值不能被调用)
create proc newProc \创建存储过程 execute newProc \调用存储过程 Create Proc 过程名
as @Parameter 参数类型 (普通参数)\给存储过程本身使用的,普通参数可以直接传递给存储过程,存储过程调用它来完成。
begin @Parameter 参数类型 output (输出参数)\利用存储过程给某些变量赋值,当然不能直接用他的返回值,
print 'hello word!'\输出hello word! as 这个时候就可以用到输出参数。
end Begin !!!!!!! 输出参数 可以将一个变量传递给它,存储过程作为输出参数,存储过程执行完成之后,会将结果直接赋值
............. 给这个变量,对这个变量重新赋值,但是这里有一点需要注意的是通过输出参数完成的赋值,而并非通过存储过程
End 的返回值来完成的赋值,这是一个和函数根本的不同
普通参数的使用
create proc newproc2 \创建存储过程名称
@testString1 varchar(60), !!!!!传递两个参数之间必须用逗号隔开,否则会有错误
@testString2 varchar(60) \调用的时候可以给它传递的两个参数,test1和test2,这两个参数在执行存储过程的时候
as 会输出下方两个print后面的值。
begin
print '第一个参数为:'+@testString1, !!!!!传递两个参数之间必须用逗号隔开,否则会有错误
print '第二个参数为:'+@testString2
end
exec newproc2 '大家好','这是存储过程' \存储过程的调用,和传递参数。
输出参数的使用
\带有输出参数的存储过程
create proc newproc8 \创建存储过程并命名
@testVarA int, \定义类型(普通参数)
@testVarB int,
@testVarSum int Output \定义类型(输出参数) \输出参数类似于函数的返回值,函数的返回值可以直接作为一个被调用的值给某一个变量赋值。
as
begin
set @testVarSum=@testVarA+@testVarB \条件
end
调用存储过程
declare @testA int \定义一个变量A
set @testA=60 \赋值
print @testA \输出变量A
execute newproc8 600,800,@testA output \调用此存储过程,并传递三个参数,将600,800,赋值给@testVarA和@testVarB,A+B的值赋给@testVarSum然后@testVarSum再赋值给@testA output
print @testA \输出 @testA output,这里的output是将@testA设定为输出参数 重新赋值,重新赋值之后就变成1400了
60 \第一个输出的结果自定义的变量@testA
1400 \第二个结果是
如何在存储过程当中通过传递进来的参数进行查找符合条件的记录
根据输入进来的数据查询符合条件的记录
create proc newProcA \创建存储过程并命名
@testNameA varchar(30) \定义传递进来的参数的数据类型
as
begin
select * from 网站职员表 where 姓名=@testNameA \从网站职员表中查找符合条件的记录,
end (在@testName中输入的参数必须和在网站职员表中的姓名字段相等(存在))
修改存储过程
存储修改有两种方法,一种是纯T-SQL语句修改,另一种是视图修改。
把所有的记录都要参与查询,
但并不是把它们都显示出来把网站职员表中所有记录工资最高的员工,把它的工资显示出来就可以,
并且作为输出参数进行输出
!!!通过视图修改存储过程
USE [LtsDatabase试验]
GO
/****** Object: StoredProcedure [dbo].[newProcA] Script Date: 06/03/2019 11:31:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[newProcA]
@testNameA varchar(30) \\@testMoney money output
as ( 修改前 ) ( 修改后 )
begin
select * from 网站职员表 where 姓名=@testNameA \\select @testMoney=MAX(工资) from 网站职员表
end ( 修改前 ) ( 修改后 )
调用此存储过程
declare @MaxMoney money \定义一个变量名称为@MaxMoney,其变量类型为货币型money
execute newProcA @MaxMoney output \调用存储过程名称为newProcA将@MaxMoney作为输出参数传递给@testMoney
select @MaxMoney as 工资最高的员工工资 \用select对变量进行输出
通过T-SQL语句修改存储过程(重新写一个新的存储过程) Create Proc \创建存储过程
alter proc newProcA \修改存储过程,名字为newProcA Alter Proc \修改存储过程
@testNameA varchar(30) Drop Proc \删除存储过程
as
begin
select * from 网站职员表 where 姓名=@testNameA
end
重命名存储过程 删除存储过程 T-SQL语句删除 删除多个过程
sp_rename newProcA,newProc \利用sp_rename进行重命名 右键存储过程直接删除 drop Proc NewProc drop Proc NewProc,NewProc2,NewProc3
(命名前)(命名后)
创建一个存储过程,传递给它两个参数它可以比较两个参数的大小。
Create Proc ProcSimple1 \创建一个存储过程,名字为ProcSimple1
@testVar1 int, \传递两个参数
@testVar2 int \传递两个参数,这两个参数是在调用存储过程的时候,向它传递的,并非输出参数,只是两个普通参数
as
begin
if @testVar1>@testVar2 \比较两个参数的大小
print cast(@testVar1 as varchar(10))+'大于'+cast(@testVar2 as varchar(20)) \将变量@testVar1和变量@testVar2的int类型转换为varchar类型。
转换
else if @testVar1<@testVar2 \比较两个参数的大小
print cast(@testVar1 as varchar(10))+'小于'+cast(@testVar2 as varchar(10))
else
print cast(@testVar1 as varchar(10))+'等于'+cast(@testVar2 as varchar(10))
end
调用存储过程
execute ProcSimple1 100,300 \调用存储过程,并比较出两个数值的大小
调用存储过程
declare @testInt1 int,@testInt2 int \定义两个变量,及变量数据类型
select @testInt1=600,@testInt2=2500 \为这两个变量赋值
execute ProcSimple1 @testInt1,@testInt2 \将@testInt1和@testInt2的值传递给存储过程ProcSimple1中@testVar1,@testVar2两个参数
调用ProcSimple1这个存储过程,输出相应的值。
创建一个存储过程 调用这个存储过程
Create proc testUser \创建存储过程并将其命名为testUser execute testUser 'user2','abc' \调用存储过程,输入用户名和密码
@testUser varchar(60), \创建普通参数,及其数据类型 用户名 密码
@testPassWord varchar(60) \创建普通参数,及其数据类型
as
begin \程序块开始执行
declare @testMsg varchar(100) \声明变量及数据类型
if @testUser='user1' \首先判断用户是否等于user1,如果是,继续往下循环
begin
if @testPassWord='123' \判断密码是否等于123
set @testMsg'欢迎学习存储过程。' \是的话,输出欢迎.....
else \否则
set @testMsg='对不起,密码错误' \输出对不起......
end
else if @testUser='user2' \在判断用户是否等于user2....往下循环
begin
if @testPassWord='abc' \再判断密码是否为abc
set @testMsg='欢迎学习存储过程。' \是的话,输出欢迎.....
else \否则
set @testMsg='对不起,密码错误' \对不起....
end
else \如果前两个条件都不成立
set @testMsg='请输入正确的用户名和密码'
print @testMsg \则输出请输入正确的....
end