- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SQL SERVER存储过程用法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Transact-SQL中的存储过程,非常类似于C#语言中的方法,可以重复调用。当存储过程执行一次后,可以将语句存储到缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能.
。
存储过程Procedure是一组为了完成特定功能的SQL语句集合,经过编译后存储在服务器端的数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名称并给出参数来执行,利用存储过程可以加速SQL语句的执行.
自定义存储过程,由用户创建并能完成某一特定功能的存储过程,但是它与函数不同,存储过程的返回值只是指明执行是否成功.
存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值.
由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担.
。
A、 存储过程允许标准组件式编程 。
存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性.
B、 存储过程能够实现较快的执行速度 。
如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些.
C、 存储过程减轻网络流量 。
对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载.
D、 存储过程可被作为一种安全机制来充分利用 。
系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全.
。
。
以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中.
。
分为两种存储过程:
一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它,
二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限.
。
创建存储过程语法:
CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ][ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS[ begin ] T-SQL 语句[ end ]
每个参数名前要有一个“@”符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外,其他SQL Server所支持的数据类型都可使用.
[OUTPUT]是用来指定该参数是输入参数还是输出参数,默认是输入参数.
。
创建测试表MyStudentInfo 。
CREATE table MyStudentInfo( Id int not null primary key, Name varchar(16), Age int, Gender varchar(2), Phone varchar(16), Address varchar(50), GradeId int, Score int)
如下图所示 。
联合插入多条数据 。
INSERT INTO MyStudentInfoSELECT 1,"张三",20,"1","15801258912","上海",1,90 UNIONSELECT 2,"李四",22,"1","12345678901","北京",1,84 UNIONSELECT 3,"王五",16,"1","13976891234","天津",2,35 UNIONSELECT 4,"赵六",19,"1","18676891234","重庆",3,56 UNIONSELECT 5,"小红",21,"2","17776891234","广州",4,82 UNIONSELECT 6,"小王",25,"2","13176891234","深圳",5,54 UNIONSELECT 7,"小刘",18,"2","13374591234","南京",6,69 UNIONSELECT 8,"小张",16,"1","13974596734","长沙",6,58 UNIONSELECT 9,"小罗",27,"1","13175122786","武汉",7,40 UNIONSELECT 10,"小袁",21,"2","17715872346","石家庄",8,34
执行结果如下图所示 。
创建表 。
CREATE table GradeInfo( Id int not null primary key, GradeName varchar(16))
如下图所示 。
联合插入多条数据 。
INSERT INTO GradeInfoSELECT 1,".NET" UNIONSELECT 2,"Android" UNIONSELECT 3,"PHP" UNIONSELECT 4,"UI" UNIONSELECT 5,"HTML5" UNIONSELECT 6,"JAVA" UNIONSELECT 9,"HADOOP" UNIONSELECT 10,"大数据"
如下图所示 。
。
-- 创建无参数的存储过程,获取MyStudentInfo表的所有记录create procedure Proc_GetInfoasbegin select * from MyStudentInfoend
执行存储过程 。
-- 执行存储过程exec Proc_GetInfo
输出结果 。
。
CREATE proc Proc_InsertData @Id int, @Name varchar(16), @Age int, @Gender varchar(2), @Phone varchar(16), @Address varchar(50), @GradeId int, @Score int as begin insert INTO MyStudentInfo VALUES(@Id,@Name,@Age,@Gender,@Phone,@Address,@Gender,@Score) end go
执行存储过程 。
exec Proc_InsertData @Id=11,@Name="小李",@Age=21,@Gender="2",@Phone="13981257512",@Address="太原",@GradeId=4,@Score=62 GO
执行结果 。
。
CREATE proc Proc_InsertDefault @Id int, @Name varchar(16), @Age int, @Gender varchar(2)="1", @Phone varchar(16), @Address varchar(50)="沈阳", @GradeId int, @Score int as begin insert INTO MyStudentInfo VALUES(@Id,@Name,@Age,@Gender,@Phone,@Address,@Gender,@Score) end go
执行存储过程 。
exec Proc_InsertDefault @Id=12,@Name="小阮",@Age=24,@Phone="13832757512",@GradeId=4,@Score=70go
。
在创建存储过程时,可以用关键字OUTPUT来创建一个输出参数,另外,调用时也必须给出OUTPUT关键字 。
create proc Proc_Out @Id int, -- 默认为输入参数 @gradeId int out -- 输出参数 as begin select @gradeId=GradeId from MyStudentInfo where id=@id end
执行存储过程,按照存储过程中定义的参数顺序 。
declare @GradeIdOut int exec Proc_Out 10,@GradeIdOut out print @GradeIdOut GO
执行结果 。
执行存储过程,指定参数名称进行赋值,参数顺序可以与定义时的参数顺序不一致 。
DECLARE @Sid intEXEC Proc_Out @gradeId=@Sid OUT,@Id=10PRINT @Sidgo
执行结果 。
。
print语句可以将用户定义的消息返回给客户端 。
编写一个存储过程,在插入学生数据前,先判断学号是否存在,如果存在, 。
输出“要插入的学生的学号已经存在”;否则,插入学生数据,返回“恭喜,数据插入成功” 。
create proc Proc_Return @Id int, @Name varchar(16), @Age int, @Gender varchar(2), @Phone varchar(16), @Address varchar(50), @GradeId int, @Score int as begin IF exists (SELECT * FROM MyStudentInfo WHERE Id=@Id) begin print "要插入的学生的学号已经存在" ROLLBACK end else begin insert INTO MyStudentInfo VALUES(@Id,@Name,@Age,@Gender,@Phone,@Address,@GradeId,@Score) print "恭喜,数据插入成功" end end GO
执行存储过程,该学号已经存在 。
exec Proc_Return @Id=10,@Name="小李",@Age=21,@Gender="2",@Phone="13981257512",@Address="太原",@GradeId=4,@Score=75go
执行结果 。
执行存储过程,插入不存在的学号 。
exec Proc_Return @Id=15,@Name="小李",@Age=21,@Gender="2",@Phone="13981257512",@Address="太原",@GradeId=4,@Score=75go
执行结果 。
()return 语句,return语句可以从过程、批处理或语句块中退出,不执行其后继语句 。
CREATE proc Proc_Delete @name varchar(16) as begin delete FROM MyStudentInfo where Name=@name return @@rowcount end
调用存储过程 。
declare @Del_Row int exec @Del_Row= Proc_Delete @name="小刘" select @Del_Row 删除的行 GO
执行结果 。
。
/*在存储过程可以定义变量,包括全局变量(@@变量名)和局部变量(@变量名)。 用于保存存储过程中的临时结果。 编写存储过程Proc_Var,根据输入的学生学号,计算该学生的平均成绩。 根据该生平均成绩与全体学生平均成绩的关系,返回相应信息*/ 。
create proc Proc_Var @id int, @ResStr varchar(16) out as begin --声明变量 declare @curAvg decimal(18,2) declare @totalAvg decimal(18,2) select @totalAvg=AVG(Score) from MyStudentInfo select @curAvg=AVG(Score) from MyStudentInfo where Id=@id IF @curAvg>@totalAvg set @ResStr="高于平均分" else set @ResStr="低于平均分" print "总平均分为:"+convert(varchar(18),@totalAvg) print "该生平均分为:"+convert(varchar(18),@curAvg) print @ResStr end
调用存储过程 。
declare @resstring varchar(20) exec Proc_Var 6,@resstring out go
执行结果 。
。
create proc Proc_OutPut @Id int,--默认输入参数 @Score int out,--输出参数 @Age int output --输入输出参数 as begin select @Score=Score,@Age=Age from MyStudentInfo where Id=@Id and Age=@Age endgo
执行存储过程 。
declare @Sid int,@SScore int,@SAge intset @Sid=8set @SAge=16exec Proc_OutPut @Sid,@SScore out,@SAge outputprint "成绩:"+convert(varchar(8),@SScore)+",年龄:"+convert(varchar(8),@SAge)go
执行结果 。
。
create proc Proc_Page@StartIndex int,@EndIndex intasbegin select COUNT(*) from MyStudentInfo select * from ( SELECT ROW_NUMBER() OVER(ORDER BY Id) AS rowid,* FROM MyStudentInfo ) temp where temp.rowid between @StartIndex AND @EndIndexendgo
执行存储过程 。
exec Proc_Page 1,4go
执行结果 。
。
create proc Proc_P@PageIndex int,@PageSize intasbegin declare @StartRow int,@EndRow int set @StartRow=(@PageIndex-1) * @PageSize +1 set @EndRow =@StartRow+@PageSize-1 select * from ( SELECT ROW_NUMBER() OVER(ORDER BY Id ASC) as rowid ,* FROM MyStudentInfo ) temp where temp.rowid between @StartRow AND @EndRowendgo
执行存储过程 。
exec Proc_P 2,4go
执行结果 。
。
-- 返回多个结果集create procedure proc_get@Stuid int,@Gradeid intasbegin select * from MyStudentInfo where id=@Stuid select * from GradeInfo where id=@Gradeidendgo
执行存储过程 。
-- 执行存储过程exec proc_get @Stuid=2,@GradeId=4
执行结果 。
。
--创建名为 GetStuCou_Ext 的返回多个结果集的存储过程create procedure GetStuCou_Ext@StuNo nvarchar(64),@Height nvarchar(32)asbegin declare @Var nvarchar(10) --定义变量 set @Var="123" --赋值变量 --定义表变量 declare @StuTab table ( ID int not null primary key, StuNo nvarchar(50) unique, Name varchar(50), Sex varchar(10), Height varchar(10) ) --表变量只能在定义的时候添加约束 --定义临时表 create table #Tab ( ID int not null primary key, StuNo nvarchar(50), Name varchar(50), Sex varchar(10), Height varchar(10) ) alter table #Tab add constraint S_UNIQUE unique(StuNo) --临时表可以在之后添加约束 if(@StuNo is not null and @StuNo <> "") begin insert into @StuTab(ID,StuNo,Name,Sex,Height) --把数据插入表变量 select S_Id,S_StuNo,S_Name,S_Sex,S_Height from Student where S_StuNo=@StuNo insert into #Tab(ID,StuNo,Name,Sex,Height) --把数据插入临时表 select S_Id,S_StuNo,S_Name,S_Sex,S_Height from Student where S_StuNo=@StuNo end if(@Height is not null and @Height <> "") begin insert into @StuTab(ID,StuNo,Name,Sex,Height) --把数据插入表变量 select S_Id,S_StuNo,S_Name,S_Sex,S_Height from Student where S_Height=@Height insert into #Tab(ID,StuNo,Name,Sex,Height) --把数据插入临时表 select S_Id,S_StuNo,S_Name,S_Sex,S_Height from Student where S_Height=@Height end SELECT * FROM @StuTab select * from #Tabend--执行名为 GetStuCou_DSS 的返回多个结果集的存储过程execute GetStuCou_Ext "005","185"
。
在存储过程中可以执行动态的SQL 。
create proc GetStus@StuNo nvarchar(500)asbegin declare @Sql nvarchar(3000) if(@StuNo is not null and @StuNo <> "") begin set @Sql=" select * from Student where S_StuNo in ("+@StuNo+") " end exec (@Sql) --执行动态 sqlendexec GetStus "003,005,009" --执行存储过程 GetStus
到此这篇关于SQL SERVER存储过程用法详解的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.cnblogs.com/dotnet261010/p/5921211.html 。
最后此篇关于SQL SERVER存储过程用法详解的文章就讲到这里了,如果你想了解更多关于SQL SERVER存储过程用法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在运行一个辅助角色,并检查 Azure 上托管的存储中是否存在数据。当我将连接字符串用于经典类型的存储时,我的代码可以正常工作,但是当我连接到 V2 Azure 存储时,它会抛出此异常。 “远程服
在我的应用程序的主页上,我正在进行 AJAX 调用以获取应用程序各个部分所需的大量数据。该调用如下所示: var url = "/Taxonomy/GetTaxonomyList/" $.getJSO
大家好,我正在尝试将我的商店导入我的 Vuex Route-Gard。 路由器/auth-guard.js import {store} from '../store' export default
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我的 Windows 计算机上的本地文件夹中有一些图像。我想将所有图像上传到同一容器中的同一 blob。 我知道如何使用 Azure Storage SDKs 上传单个文件BlockBlobServi
我尝试发出 GET 请求来获取我的 Azure Blob 存储帐户的帐户详细信息,但每次都显示身份验证失败。谁能判断形成的 header 或签名字符串是否正确或是否存在其他问题? 代码如下: cons
这是用于编写 JSON 的 NeutralinoJS 存储 API。是否可以更新 JSON 文件(推送数据),而不仅仅是用新的 JS 对象覆盖数据。怎么做到的??? // Javascript
我有一个并行阶段设置,想知道是否可以在嵌套阶段之前运行脚本,所以像这样: stage('E2E-PR-CYPRESS') { when { allOf {
我想从命令行而不是从GUI列出VirtualBox VM的详细信息。我对存储细节特别感兴趣。 当我在GUI中单击VM时,可以看到包括存储部分在内的详细信息: 但是到目前为止,我还没有找到通过命令行执行
我有大约 3500 个防洪设施,我想将它们表示为一个网络来确定流动路径(本质上是一个有向图)。我目前正在使用 SqlServer 和 CTE 来递归检查所有节点及其上游组件,只要上游路径没有 fork
谁能告诉我 jquery data() 在哪里存储数据以及何时删除以及如何删除? 如果我用它来存储ajax调用结果,会有性能问题吗? 例如: $("body").data("test", { myDa
有人可以建议如何为 Firebase 存储中的文件设置备份。我能够备份数据库,但不确定如何为 firebase 存储中的文件(我有图像)设置定期备份。 最佳答案 如何进行 Firebase 存储的本地
我最近开始使用 firebase 存储和 firebase 功能。现在我一直在开发从功能到存储的文件上传。 我已经让它工作了(上传完成并且文件出现在存储部分),但是,图像永远保持这样(永远在右侧加载)
我想只允许用户将文件上传到他们自己的存储桶中,最大文件大小为 1MB,仍然允许他们删除文件。我添加了以下内容: match /myusers/{userId}/{allPaths=**} { al
使用生命周期管理策略将容器的内容从冷访问层移动到存档。我正在尝试以下策略,希望它能在一天后将该容器中的所有文件移动到存档层,但事实并非如此在职的。我设置了选择标准“一天未使用后”。 这是 json 代
对于连接到 Azure 存储端点,有 http 和 https 两个选项。 第一。 https 会带来开销,可能是 5%-10%,但我不支付同一个数据中心的费用。 第二。 http 更快,但 Auth
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
我是一名优秀的程序员,十分优秀!