当前位置:首页 » 编程语言 » sql集合容器如何储存
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql集合容器如何储存

发布时间: 2022-09-12 01:44:55

1. sql Server2005中存储过程的类型有哪些

存储过程是指封装了可重用代码的模块或例程。存储过程可以接受输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言 (DDL) 和数据操作语言 (DML) 语句,然后返回输出参数。在 SQL Server 2005 中,存储过程有两种类型:Transact-SQL 或 CLR。

Transact-SQL
Transact-SQL 存储过程是指保存的 Transact-SQL 语句集合,可以接受和返回用户提供的参数。例如,存储过程中可能包含根据客户端应用程序提供的信息在一个或多个表中插入新行所需的语句。存储过程也可能从数据库向客户端应用程序返回数据。

CLR
CLR 存储过程是指对 Microsoft .NET Framework 公共语言运行时 (CLR) 方法的引用,可以接受和返回用户提供的参数。它们在 .NET Framework 程序集中是作为类的公共静态方法实现的。

2. oracle SQL语句中怎么样调用存储过程

PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL/SQL程序。

PL/SQL的优点

从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句。

PL/SQL的优点如下:

. PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。

. PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型

. PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有很好的可重用性。

. 可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。

. PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是非常便利的

. 对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL是以整个语句块发给服务器,这就降低了网络拥挤。

PL/SQL块结构

PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:

声明部分(Declaration section)

声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。

执行部分(Executable section)

执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。

异常处理部分(Exception section)

这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。

PL/SQL块语法

[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END

PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。

PL/SQL块的命名和匿名

PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块。匿名程序块可以用在服务器端也可以用在客户端。

命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。

PL/SQL程序块可背独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序:

. 函数

. 过程

. 包

. 触发器

函数

函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:

FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]

过程

存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下:

PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]


包(package)

包其实就是被组合在一起的相关对象的集合,当包中任何函数或存储过程被调用,包就被加载入内存中,包中的任何函数或存储过程的子程序访问速度将大大加快。
包由两个部分组成:规范和包主体(body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标。

触发器(trigger)

触发器与一个表或数据库事件联系在一起的,当一个触发器事件发生时,定义在表上的触发器被触发。

变量和常量

变量存放在内存中以获得值,能被PL/SQL块引用。你可以把变量想象成一个可储藏东西的容器,容器内的东西是可以改变的。

声明变量

变量一般都在PL/SQL块的声明部分声明,PL/SQL是一种强壮的类型语言,这就是说在引用变量前必须首先声明,要在执行或异常处理部分使用变量,那么变量必须首先在声明部分进行声明。

声明变量的语法如下:

Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]

注意:可以在声明变量的同时给变量强制性的加上NOT NULL约束条件,此时变量在初始化时必须赋值。

给变量赋值

给变量赋值有两种方式:

. 直接给变量赋值

X:=200;
Y=Y+(X*20);

. 通过SQL SELECT INTO 或FETCH INTO给变量赋值

SELECT SUM(SALARY),SUM(SALARY*0.1)
INTO TOTAL_SALARY,TATAL_COMMISSION
FROM EMPLOYEE
WHERE DEPT=10;

常量

常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,,他的声明方式与变量相似,但必须包括关键字CONSTANT。常量和变量都可被定义为SQL和用户定义的数据类型。

ZERO_VALUE CONSTANT NUMBER:=0;

这个语句定了一个名叫ZERO_VALUE、数据类型是NUMBER、值为0的常量。

标量(scalar)数据类型

标量(scalar)数据类型没有内部组件,他们大致可分为以下四类:

. number
. character
. date/time
. boolean

3. SET集合容器的存储结构是什么样子呢求个大神解析下!!

HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT。其实你要看底层最好阅读API源码,如下

publicclassHashSet<E>
extendsAbstractSet<E>
implementsSet<E>,Cloneable,java.io.Serializable
{
//使用HashMap的key保存HashSet中所有元素
privatetransientHashMap<E,Object>map;
//定义一个虚拟的Object对象作为HashMap的value
=newObject();
...
//初始化HashSet,底层会初始化一个HashMap
publicHashSet()
{
map=newHashMap<E,Object>();
}
//以指定的initialCapacity、loadFactor创建HashSet
//其实就是以相应的参数创建HashMap
publicHashSet(intinitialCapacity,floatloadFactor)
{
map=newHashMap<E,Object>(initialCapacity,loadFactor);
}
publicHashSet(intinitialCapacity)
{
map=newHashMap<E,Object>(initialCapacity);
}
HashSet(intinitialCapacity,floatloadFactor,booleanmmy)
{
map=newLinkedHashMap<E,Object>(initialCapacity
,loadFactor);
}
//调用map的keySet来返回所有的key
publicIterator<E>iterator()
{
returnmap.keySet().iterator();
}
//调用HashMap的size()方法返回Entry的数量,就得到该Set里元素的个数
publicintsize()
{
returnmap.size();
}
//调用HashMap的isEmpty()判断该HashSet是否为空,
//当HashMap为空时,对应的HashSet也为空
publicbooleanisEmpty()
{
returnmap.isEmpty();
}
//调用HashMap的containsKey判断是否包含指定key
//HashSet的所有元素就是通过HashMap的key来保存的
publicbooleancontains(Objecto)
{
returnmap.containsKey(o);
}
//将指定元素放入HashSet中,也就是将该元素作为key放入HashMap
publicbooleanadd(Ee)
{
returnmap.put(e,PRESENT)==null;
}
//调用HashMap的remove方法删除指定Entry,也就删除了HashSet中对应的元素
publicbooleanremove(Objecto)
{
returnmap.remove(o)==PRESENT;
}
//调用Map的clear方法清空所有Entry,也就清空了HashSet中所有元素
publicvoidclear()
{
map.clear();
}
...
}

由上面源程序可以看出,HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet
中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。

4. 如何将数据库中所有数据存入数组

放到数组我不知道为什么这么做,你数据库的类型都是一样吗?要是整型和字符串你可以放一个数组里?
你可以用结果集取出来放到list集合里
反正放到一个容器里就可以了,最好用个泛型
如:User实体类,你先可以封装到populate的方法里
当然方法名你随便取,
String
sql
=
"select
*
from
t_user";
List
userlist
=
null;
try{
Connection
conn
=
this.getConnection;
PreparedStatement
pst
=
conn.PreparedStatement
(sql);
ResultSet
rs
=
pst.executeQuery();
userlist
=
new
ArrayList
();
while(rs.next()){
User
user
=
new
User();
user.setId(rs.getInt("id"));
user.setCode(rs.getString("code"));
userlist.add(user);
}
this.getClose(conn,pst,rs);
}catch(Exception
e){
printStackTrace();
}
return
userlist;
我手打的个别打错了你在开发工具里看看

5. sql 存储过程可以存储集合吗

SQL Server 通过 RETURN TABLE 来实现。
1> CREATE FUNCTION getHelloWorld()
2> RETURNS TABLE
3> AS
4> RETURN
5> SELECT 'Hello' AS A, 'World' AS B;
6> GO
1> SELECT * FROM getHelloWorld();
2> go
A B

6. sql一个表只能储存在一个文件中吗

不一定。
在SQL语言中,一个基本表可以跨多个存储文件存放,一个存储文件可以存放一个或多个基本表。
存储过程和函数与Java中的方法很相似,存储过程就是一组预先编译好的SQL语句的集合,它可以提高代码的可用性,还可以减少编译次数,也减少了与数据库服务器的连接次数,提高了效率。存储过程应该先创建后调用。

7. SQL 存储过程建立和使用方法

Sql Server的存储过程是一个被命名的存储在服务器上的Transacation-Sql语句集合,是封装重复性工作的一种方法,它支持用户声明的变量、条件执行和其他强大的编程功能。 存储过程相对于其他的数据库访问方法有以下的优点: (1)重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。 (2)提高性能。存储过程在创建的时候就进行了编译,将来使用的时候不用再重新编译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。 (3)减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。 (4)安全性。参数化的存储过程可以防止SQL注入式的攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。 存储过程一共分为了三类:用户定义的存储过程、扩展存储过程以及系统存储过程。 其中,用户定义的存储过程又分为Transaction-SQL和CLR两种类型。 Transaction-SQL 存储过程是指保存的Transaction-SQL语句集合,可以接受和返回用户提供的参数。 CLR存储过程是指对.Net Framework公共语言运行时(CLR)方法的引用,可以接受和返回用户提供的参数。他们在.Net Framework程序集中是作为类的公共静态方法实现的。(本文就不作介绍了) 创建存储过程的语句如下:Code
CREATE { PROC | PROCEDURE } [schema_name.] procere_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH <procere_option> [ ,n ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ n ] | <method_specifier> }
[;]
<procere_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]

<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }

<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name [schema_name]: 代表的是存储过程所属的架构的名称 例如: Create Schema yangyang8848
Go
Create Proc yangyang8848.AllGoods
As Select * From Master_Goods
Go 执行:Exec AllGoods 发生错误。 执行:Exec yangyang8848.AllGoods 正确执行。 [;Number]: 用于对同名过程进行分组的可选整数。使用一个 DROP PROCEDURE 语句可将这些分组过程一起删除。 例如: Create Proc S1 ;1
AS
Select * From Master_Goods
Go
Create Proc S1 ;2
As
Select * From Master_Location
Go 创建完毕了两个存储过程。它们在同一个组S1里,如果执行Exec S1 则存储过程默认执行 Exec S1 ;1 。如果我们想得到所有据点信息则需要执行Exec S1 ;2。当我们要删除存储过程的时候,只能执行Drop Exec S1 则该组内所有的存储过程被删除。 [@ parameter]: 存储过程中的参数,除非将参数定义的时候有默认值或者将参数设置为等于另一个参数,否则用户必须在调用存储过程的时候为参数赋值。 存储过程最多有2100个参数。 例如: Create Proc yangyang8848.OneGoods
@GoodsCode varchar(10)
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Go 调用的代码: Declare @Code varchar(10)
Set @Code = '0004'
Exec yangyang8848.OneGoods @Code 在参数的后边加入Output 表明该参数为输出参数。 Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 调用方法:
Declare @VV2 varchar(10)
Exec yangyang8848.OneGoods @Code out 注意:如果存储过程的两个参数一个有默认值一个没有,那么我们要把有默认值得放在后边,不然会出问题哦~~ 细心的朋友,可能看到上边的语句有一些不同,比如,存储过程用的是output,而调用语句用的是out。我要告诉您,两者是一样的。 [RECOMPILE]:指示数据库引擎 不缓存该过程的计划,该过程在运行时编译。如果指定了 FOR REPLICATION,则不能使用此选项。对于 CLR 存储过程,不能指定 RECOMPILE。 这个说一个非常好用的函数 OBJECT_ID :返回架构范围内对象的数据库对象标识号。 例如:我们创建存储过程时,可以如下写代码 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 针对于上边的这个存储过程,我们调用以下SQL查询 Select definition From sys.sql_moles
Where object_id = Object_ID('yangyang8848.OneGoods'); 我们是可以查到结果的。 可是如果我们对该存储过程加入[ ENCRYPTION ] 那么你将无法看到任何结果 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011' With Encryption
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go</SPAN> 然后我们查询 sys.sql_moles 目录视图,将返回给你Null。</p> 然后我们执行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods' 你将得到以下结果:The text for object 'yangyang8848.OneGoods' is encrypted. 说到这里你应该明白了,参数[ ENCRYPTION ]:是一种加密的功能, 将 CREATE PROCEDURE 语句的原始文本转换为模糊格式。模糊代码的输出在 SQL Server 2005 的任何目录视图中都不能直接显示。对系统表或数据库文件没有访问权限的用户不能检索模糊文本。但是,可通过 DAC 端口访问系统表的特权用户或直接访问数据库文件的特权用户可使用此文本。此外,能够向服务器进程附加调试器的用户可在运行时从内存中检索已解密的过程。 前两天写了一篇关于游标的介绍文章 ,下边写一个例子,将游标与存储过程一起使用上: If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go Create Proc GetMasterGoods
@MyCursor Cursor Varying Output
With Encryption
As
Set @MyCursor = Cursor
For
Select GoodsCode,GoodsName From Master_Goods
Open @MyCursor
Go --下边建立另外一个存储过程,用于遍历游标输出结果 Create Proc GetAllGoodsIDAndName
As Declare @GoodsCode varchar(18)
Declare @GoodsName nvarchar(20)
Declare @MasterGoodsCursor Cursor
Exec GetMasterGoods @MasterGoodsCursor out
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Print @GoodsCode + ':' + @GoodsName
End
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
End
Close @MasterGoodsCursor
Deallocate @MasterGoodsCursor
Go 最后执行Exec GetAllGoodsIDAndName结果为以下内容 0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014

8. Windows Server 2016第三版技术预览带来了哪些新特性

随着Windows Server 2016和System Center2016第 三版技术预览的发布,我们也迎来了全新的里程碑。借助这两个分别针对混合云和数据中心的解决方案的推出,微软希望能够帮助用户将云计算的灵活性引入企业。 对于微软来说,这些里程碑式的产品在公司发展历程中扮演了重要角色,它让我们有机会了解各个用户群体的看法。我们也希望用户能够从一开始就了解我们推出此 产品的初衷、熟悉新的功能,并了解这项新技术将如何改进你的业务。

对于用户来说,此次的亮点是首次发布的Windows Server容器。这是将容器技术带入WindowsServer生态系统的第一步,我们对随之而来的可能性感到非常兴奋。你可能已经看到容器技术的发展势头,这种新技术可以简化应用的开发与部署。我们致力于让容器技术成为现代应用平台的一部分,并将其整合在2016年推出的数据中心解决方案中,提供给我们的客户。您可以通过MikeNeil的博客了解有关于容器技术创新的更多信息。
容器仅仅是Windows Server和SystemCenter技术预览版众多新特性中的一个。除此之外,我们还增强了上一个预览版中的功能,并添加了一些新的特性,供你第一时间进行评估。
Nano Server

作为最小的内存部署选项,就像在技术预览版2阶段一样,Nano Server可以被安装在物理主机或虚拟机上。新的EmergencyManagement Console让用户可以在NanoServer控制台中直接查看和修复网络配置。此外,我们还提供PowerShell脚本用于创建一个运行NanoServer的Azure虚拟机。从应用的角度来说,你现在可以使用CoreCLR运行ASP.Netv5应用。总而言之,我们增加了重大功能以扩展Nano Server能力,而这一切的更新都建立在维持原有内存占用的基础之上。
软件定义网络
在第三版技术预览中,你会发现绝大多数网络功能是新增的。我们引入了用于编程政策的可扩展网络控制器、用于高可用性和高性能的L4负载均衡器、用于混合连接的增强网关,以及融合了RDMA流量和租户流量的底层网络结构。在此次发布的预览版中,你将首次体验到我们在Azure中使用的核心网络功能套件和SDN架构。
安全
此次发布的预览版增加了对于Hyper-V的投入:包括某些用于下一版本的安全创新。虚拟机隔离是我们承诺的核心,即帮助你保护共享环境中的资源。现在,你可以通过一个署名模板测试创建一个屏蔽虚拟机,以及该新屏蔽虚拟机的其他功能。你还可以发现WindowsServer扮演的全新角色——Host Guardian Service,管理员可以识别合法主机。
工作负载支持
● 用于增强关键工作复杂支持的附加特性和功能包括:
● 借助拥有OpenGL支持的Remote Desktop Services提高应用兼容性。
● 借助Storage Replica,对面向延展集群的站点感知而改进业务连续性场景。
● 通过为SQL Server集群删除特定域容器而增加灵活性。
管理
在System Center 2016第三版技术预览版中,增强的特性简化了WindowsServer中新功能的管理。包括对Virtual Machine Manager的改进,如支持集群节点的滚动升级,支持NanoServer作为主机和文件服务器。通过轻松管理隔离虚拟机和受保护主机,你还可以充分利用我们针对共享环境的安全增强功能。在存储方面,你会看到改进的功能,以保持满足预期的端对端服务质量(QoS)和更快速的数据(使用存储分层)检索。在OperationsManager中,我们则侧重于通过管理包的可发现性,和使用PowerShel自动化维护窗口的能力,来提升用户体验。
此外,我们还发布了面向Windows 10客户端的Remote Server AdministrationTools(RSAT),实现对Windows Server 2016技术预览版、Windows Server 2012R2和Windows Server 2012的远程管理。
更多的新特性待你评估,详情可查看Experience Guides;我们还欢迎各位参加我们的User Voice计划,参与整个开发过程。目前Windows Server 2016第三版技术预览及System Center 2016第三版技术预览都已经开放下载。期待来自你的建议。

注意:以上提到的软件、特性及功能均基于预览版,实际发布时可能会有所不同。

9. SQL数据库怎样使用表组织数据

我们使用SQL数据库其实就是使用很多表,数据库是由表组成的,而数据也是以表的形式展现出来的,表是列的集合也是信息数据的容器,很多表就构成了数据库。这篇文章讲解如何使用表组织数据,使数据库的结构完整性。下面我们采用个案例:建立学生数据库表来讲解如何创建数据库使用表组织数据。

10. “SQL Server的存储过程”是什么意思

在使用 Microsoft® SQL Server™ 2000 创建应用程序时,Transact-SQL 编程语言是应用程序和 SQL Server 数据库之间的主要编程接口。使用 Transact-SQL 程序时,可用两种方法存储和执行程序。可以在本地存储程序,并创建向 SQL Server 发送命令并处理结果的应用程序;也可以将程序在 SQL Server 中存储为存储过程,并创建执行存储过程并处理结果的应用程序。

SQL Server 中的存储过程与其它编程语言中的过程类似,原因是存储过程可以:

接受输入参数并以输出参数的形式将多个值返回至调用过程或批处理。

包含执行数据库操作(包括调用其它过程)的编程语句。

向调用过程或批处理返回状态值,以表明成功或失败(以及失败原因)。
可使用 Transact-SQL EXECUTE 语句运行存储过程。存储过程与函数不同,因为存储过程不返回取代其名称的值,也不能直接用在表达式中。

使用 SQL Server 中的存储过程而不使用存储在客户计算机本地的 Transact-SQL 程序的优势有:

允许模块化程序设计。
只需创建过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。存储过程可由在数据库编程方面有专长的人员创建,并可独立于程序源代码而单独修改。

允许更快执行。
如果某操作需要大量 Transact-SQL 代码或需重复执行,存储过程将比 Transact-SQL 批代码的执行要快。将在创建存储过程时对其进行分析和优化,并可在首次执行该过程后使用该过程的内存中版本。每次运行 Transact-SQL 语句时,都要从客户端重复发送,并且在 SQL Server 每次执行这些语句时,都要对其进行编译和优化。

减少网络流量。
一个需要数百行 Transact-SQL 代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。

可作为安全机制使用。
即使对于没有直接执行存储过程中语句的权限的用户,也可授予他们执行该存储过程的权限。

SQL Server 存储过程是用 Transact-SQL 语句 CREATE PROCEDURE 创建的,并可用 ALTER PROCEDURE 语句进行修改。存储过程定义包含两个主要组成部分:过程名称及其参数的说明,以及过程的主体(其中包含执行过程操作的 Transact-SQL 语句)。