`
happmaoo
  • 浏览: 4335994 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SQL Server联机丛书:执行存储过程

阅读更多

EXECUTE

执行标量值的用户定义函数、系统过程、用户定义存储过程或扩展存储过程。同时支持 Transact-SQL 批处理内的字符串的执行

若要唤醒调用函数,请使用 EXECUTE stored_procedure 中描述的语法。

语法
执行存储过程:
[[EXEC[UTE]]
{
[@return_status=]
{procedure_name[;number]|@procedure_name_var
}
[[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]]
[,...n]
[WITHRECOMPILE]
执行字符串:
EXEC[UTE]({@string_variable|[N]'tsql_string'}[+...n])
参数

@return_status
是一个可选的整型变量,保存存储过程的返回状态。这个变量在用于 EXECUTE 语句前,必须在批处理、存储过程或函数中声明过。

在用于唤醒调用标量值用户定义函数时,@return_status 变量可以是任何标量数据类型。

procedure_name
是拟调用的存储过程的完全合法或者不完全合法的名称。过程名称必须符合标识符规则。有关更多信息,请参见使用标识符。无论服务器的代码页或排序方式如何,扩展存储过程的名称总是区分大小写。
用户可以执行在另一数据库中创建的过程,只要该用户拥有此过程或有在该数据库中执行它的适当的权限。用户可以在另一台运行 Microsoft® SQL Server™ 的服务器上执行过程,只要该用户有适当的权限使用该服务器(远程访问),并能在数据库中执行该过程。如果指定了服务器名称但没有指定数据库名称,SQL Server 会在用户默认的数据库中寻找该过程。

;number
是可选的整数,用于将相同名称的过程进行组合,使得它们可以用一句 DROP PROCEDURE 语句除去。该参数不能用于扩展存储过程。
在同一应用程序中使用的过程一般都以该方式组合。例如,在订购应用程序中使用的过程可以 orderproc;1、orderproc;2 等来命名。DROP PROCEDURE orderproc 语句将除去整个组。在对过程分组后,不能除去组中的单个过程。例如,DROP PROCEDURE orderproc;2 是不允许的。有关过程组的更多信息,请参见 CREATE PROCEDURE。

@procedure_name_var
是局部定义变量名,代表存储过程名称。

@parameter
是过程参数,在 CREATE PROCEDURE 语句中定义。参数名称前必须加上符号 (@)。在以 @parameter_name = value 格式使用时,参数名称和常量不一定按照 CREATE PROCEDURE 语句中定义的顺序出现。但是,如果有一个参数使用 @parameter_name = value 格式,则其它所有参数都必须使用这种格式。
默认情况下,参数可为空。如果传递 NULL 参数值,且该参数用于 CREATE 或 ALTER TABLE 语句中不允许为 NULL 的列(例如,插入至不允许为 NULL 的列),SQL Server 就会报错。为避免将 NULL 参数值传递给不允许为 NULL 的列,可以在过程中添加程序设计逻辑或采用默认值(使用 CREATE 或 ALTER TABLE 语句中的 DEFAULT 关键字)。

value
是过程中参数的值。如果参数名称没有指定,参数值必须以 CREATE PROCEDURE 语句中定义的顺序给出。
如果参数值是一个对象名称、字符串或通过数据库名称或所有者名称进行限制,则整个名称必须用单引号括起来。如果参数值是一个关键字,则该关键字必须用双引号括起来。

如果在 CREATE PROCEDURE 语句中定义了默认值,用户执行该过程时可以不必指定参数。如果该过程使用了带 LIKE 关键字的参数名称,则默认值必须是常量,并且可以包含 %、_、[ ] 及 [^] 通配符。
默认值也可以为 NULL。通常,过程定义会指定当参数值为 NULL 时应该执行的操作。

@variable
是用来保存参数或者返回参数的变量。

OUTPUT
指定存储过程必须返回一个参数。该存储过程的匹配参数也必须由关键字 OUTPUT 创建。使用游标变量作参数时使用该关键字。
如果使用 OUTPUT 参数,目的是在调用批处理或过程的其它语句中使用其返回值,则参数值必须作为变量传递(即 @parameter = @variable)。如果一个参数在 CREATE PROCEDURE 语句中不是定义为 OUTPUT 参数,则对该参数指定 OUTPUT 的过程不能执行。不能使用 OUTPUT 将常量传递给存储过程;返回参数需要变量名称。在执行过程之前,必须声明变量的数据类型并赋值。返回参数可以是 text 或 image 数据类型以外的任意数据类型。

DEFAULT
根据过程的定义,提供参数的默认值。当过程需要的参数值没有事先定义好的默认值,或缺少参数,或指定了 DEFAULT 关键字,就会出错。

n
是占位符,表示在它前面的项目可以多次重复执行。例如,EXECUTE 语句可以指定一个或者多个 @parameter、value 或 @variable

WITH RECOMPILE
强制编译新的计划。如果所提供的参数为非典型参数或者数据有很大的改变,使用该选项。在以后的程序执行中使用更改过的计划。该选项不能用于扩展存储过程。建议尽量少使用该选项,因为它消耗较多系统资源。

@string_variable
是局部变量的名称。@string_variable 可以是 charvarcharnchar nvarchar 数据类型,最大值为服务器的可用内存。如果字符串长度超过 4,000 个字符,则把多个局部变量串联起来用于 EXECUTE 字符串。有关系统提供的 SQL Server 数据类型更多的信息,请参见数据类型

[N]'tsql_string'
是一个常量,tsql_string 可以是 nvarchar varchar 数据类型。如果包含 N,则该字符串将解释为 nvarchar 数据类型,最大值为服务器的可用内存。如果字符串长度超过 4,000 个字符,则把多个局部变量串联起来用于 EXECUTE 字符串。

注释

如果过程名称的前三个字符为 sp_,SQL Server 会在 Master 数据库中寻找该过程。如果没能找到合法的过程名称,SQL Server 会寻找所有者名称为 dbo 的过程。若要将存储过程名称解析为与系统存储过程同名的用户定义存储过程,请提供一个完全合法的过程名称。

参数可以通过利用 value @parameter_name = value 来提供参数不是事务的一个部分;因而如果事务中的参数值更改,且该事务在以后回滚,该参数值不会退回到以前的值。返回给调用方的值总是过程返回时的值。

当一个存储过程调用另一个存储过程时,会产生嵌套。当调用的过程开始执行时,嵌套级会增加,当调用过程执行结束时,嵌套级则会减少。嵌套级最高为32级,超过32级时,会导致整个调用过程链失败。当前的嵌套级存储在 @@NESTLEVEL 函数中。

SQL Server 目前使用返回值 0 到 -14 来表示存储过程的执行状态。值 –15 到 -99 留作后用。有关保留的返回状态值的列表的更多信息,请参见 RETURN

因为远程存储过程和扩展存储过程不在事务的作用域中(除非在 BEGIN DISTRIBUTED TRANSACTION 语句中发出或者是和不同的配置选项一起使用),所以通过调用执行的命令不能回滚。有关更多信息,请参见系统存储过程和 BEGIN DISTRIBUTED TRANSACTION。

当使用游标变量时,如果执行的过程传递一个分配有游标的游标变量,就会出错。

在执行存储过程时,如果语句是批处理中的第一个语句,则不一定要指定 EXECUTE 关键字。

使用带字符串的 EXECUTE 命令

使用字符串串联运算符 (+) 为动态执行创建长字符串。每个字符串表达式可以是 Unicode 与 non-Unicode 数据类型的混合。

尽管每个 [N] 'tsql_string' 或 @string_variable 不得超过 8,000 个字节,SQL Server 语法分析器中对这种串联只进行逻辑处理而不占用物理内存。例如,该语句决不会生成长 16,000 个串联起来的字符串:

EXEC('name_of_8000_char_string'+'another_name_of_8000_char_string')

在 EXECUTE 语句执行前,不会编译 EXECUTE 语句内的语句。
数据库环境的更改只在 EXECUTE 语句结束前有效。例如,在这个例子的 EXEC 后,数据库环境是 master

USEmasterEXEC("USEpubs")SELECT*FROMauthors

权限

存储过程的 EXECUTE 权限默认给该存储过程的所有者,该所有者可以将此权限转让给其他用户。当遇到 EXECUTE 语句时,即使 EXECUTE 语句是在存储过程中,也会检查在 EXECUTE 字符串内使用该语句的权限。当运行一个执行字符串的存储过程时,系统会在执行该过程的用户环境中,而不是在创建该过程的用户环境中检查权限。但是,如果某用户拥有两个存储过程,并且第一个过程调用第二个过程,则在第二个过程中不进行 EXECUTE 权限检查。

示例

A. 使用 EXECUTE 传递单个参数

showind 存储过程需要参数 (@tabname),它是一个表的名称。下面这个例子执行 showind 存储过程,以 titles 为参数值。

<!--NOTE-->

说明showind 存储过程只是用来作为一个例子,pubs 数据库并没有此过程。

<!--/NOTE-->

EXEC showind titles
在执行过程中变量可以显式命名:
EXEC showind @tabname = titles

如果这是 isql 脚本或批处理中第一个语句,则 EXEC 语句可以省略:

showind titles
-或-
showind @tabname = titles
B. 使用多个参数与一个输出参数

这个例子执行 roy_check 存储过程,传递三个参数。第三个参数 @pc 是输出参数。过程执行完后,返回变量可以从变量@percent
得到。

<!--NOTE-->

说明roy_check 存储过程只是用作举例,pubs 数据库中并没有此过程。

<!--/NOTE-->

DECLARE @percent int
EXECUTE roy_check 'BU1032', 1050, @pc = @percent OUTPUT
SET Percent = @percent
C.使用带一个变量的 EXECUTE 'tsql_string' 语句

这个例子显示 EXECUTE 语句如何处理动态生成的、含有变量的字符串。这个例子创建 tables_cursor 游标来保存所有用户定义表
(type = U) 的列表。

<!--NOTE-->

说明此例子只用作举例。

DECLAREtables_cursorCURSOR
FOR
SELECTnameFROMsysobjectsWHEREtype='U'
OPENtables_cursor
DECLARE@tablenamesysname
FETCHNEXTFROMtables_cursorINTO@tablename
WHILE(@@FETCH_STATUS<>-1)
BEGIN
/*A@@FETCH_STATUSof-2meansthattherowhasbeendeleted.
Thereisnoneedtotestforthisbecausethisloopdropsall
user-definedtables.*/.
EXEC('DROPTABLE'+@tablename)
FETCHNEXTFROMtables_cursorINTO@tablename
END
PRINT'Alluser-definedtableshavebeendroppedfromthedatabase.'
DEALLOCATEtables_cursor
D.使用带远程存储过程的 EXECUTE 语句

这个例子在远程服务器 SQLSERVER1 上执行 checkcontract 存储过程,在 @retstat 中保存返回状态,说明运行成功或失败。

DECLARE@retstatint
EXECUTE@retstat=SQLSERVER1.pubs.dbo.checkcontract'409-56-4008'
E. 使用带扩展存储过程的 EXECUTE 语句

下例使用 xp_cmdshell 扩展存储过程列出文件扩展名为 .exe 的所有文件的目录。

USEmaster
EXECUTExp_cmdshell'dir*.exe'
F. 使用带一个存储过程变量的 EXECUTE 语句

这个例子创建一个代表存储过程名称的变量。

DECLARE@proc_namevarchar(30)
SET@proc_name='sp_who'
EXEC@proc_name

G. 使用带 DEFAULT 的 EXECUTE 语句

这个例子创建了一个存储过程,过程中第一个和第三个参数为默认值。当运行该过程时,如果调用时没有传递值或者指定了默认值,
这些默认值就会赋给第一个和第三个参数。注意 DEFAULT 关键字有多种使用方法。

USEpubs
IFEXISTS(SELECTnameFROMsysobjects
WHEREname='proc_calculate_taxes'ANDtype='P')
DROPPROCEDUREproc_calculate_taxes
GO
--Createthestoredprocedure.
CREATEPROCEDUREproc_calculate_taxes(@p1smallint=42,@p2char(1),
@p3varchar(8)='CAR')
AS
SELECT*
FROMmytable

proc_calculate_taxes 存储过程可以以多种组合方式执行:

EXECUTEproc_calculate_taxes@p2='A'
EXECUTEproc_calculate_taxes69,'B'
EXECUTEproc_calculate_taxes69,'C','House'
EXECUTEproc_calculate_taxes@p1=DEFAULT,@p2='D'
EXECUTEproc_calculate_taxesDEFAULT,@p3='Local',@p2='E'
EXECUTEproc_calculate_taxes69,'F',@p3=DEFAULT
EXECUTEproc_calculate_taxes95,'G',DEFAULT
EXECUTEproc_calculate_taxesDEFAULT,'H',DEFAULT
EXECUTEproc_calculate_taxesDEFAULT,'I',@p3=DEFAULT
转自: http://goaler.xicp.net/ShowLog.asp?ID=516
分享到:
评论

相关推荐

    sqlServer执行存储过程报错:42000,执行该sql即可

    sqlServer执行存储过程报错:42000 - [SQL Server]SQL Server 阻止了对组件“Ole Automation Procedures”的 过程“sys.sp_OACreate”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以...

    Microsoft SQL Server 2005 Express Edition SP3

    SQL Server Express 联机丛书中的“硬件和软件要求 (SQL Server Express)”主题中没有提供操作系统的精确列表。SQL Server Express 支持下列操作系统。 Windows Server 2003 SP1 Windows Server 2003 Enterprise ...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    4.3 通过存储过程配置SQL Server 4.3.1 使用SQL Server Management Studio查询 4.3.2 执行查询和改变设置 4.3.3 检查和设置配置参数 4.3.4 使用ALTER DATABASE改变设置 第Ⅱ部分 SQL Server 2008的系统管理 第5章 ...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    4.3 通过存储过程配置SQL Server 4.3.1 使用SQL Server Management Studio查询 4.3.2 执行查询和改变设置 4.3.3 检查和设置配置参数 4.3.4 使用ALTER DATABASE改变设置 第Ⅱ部分 SQL Server 2008的系统管理 第5章 ...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    4.3 通过存储过程配置SQL Server 4.3.1 使用SQL Server Management Studio查询 4.3.2 执行查询和改变设置 4.3.3 检查和设置配置参数 4.3.4 使用ALTER DATABASE改变设置 第Ⅱ部分 SQL Server 2008的系统管理 第5章 ...

    SQL Server 2008高级程序设计 4/6

     2.1 联机丛书  2.2 SQL Server配置管理器  2.3 SQL Server Management Studio  2.4 SQL Server Business Intelligence Development Studio  2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  ...

    SQL Server 2008高级程序设计 2/6

     2.1 联机丛书  2.2 SQL Server配置管理器  2.3 SQL Server Management Studio  2.4 SQL Server Business Intelligence Development Studio  2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  ...

    SQL.Server.2008管理员必备指南.part2.rar(2/4)

     4.3 通过存储过程配置SQL Server 88  4.3.1 使用SQL Server Management Studio查询 88  4.3.2 执行查询和改变设置 90  4.3.3 检查和设置配置参数 91  4.3.4 使用ALTER DATABASE改变设置 95  第Ⅱ部分 SQL ...

    SQL.Server.2008管理员必备指南.part1.rar(1/4)

     4.3 通过存储过程配置SQL Server 88  4.3.1 使用SQL Server Management Studio查询 88  4.3.2 执行查询和改变设置 90  4.3.3 检查和设置配置参数 91  4.3.4 使用ALTER DATABASE改变设置 95  第Ⅱ部分 SQL ...

    SQL.Server.2008管理员必备指南.part4.rar(4/4)

     4.3 通过存储过程配置SQL Server 88  4.3.1 使用SQL Server Management Studio查询 88  4.3.2 执行查询和改变设置 90  4.3.3 检查和设置配置参数 91  4.3.4 使用ALTER DATABASE改变设置 95  第Ⅱ部分 SQL ...

    SQL Server 2008高级程序设计 5/6

     2.1 联机丛书  2.2 SQL Server配置管理器  2.3 SQL Server Management Studio  2.4 SQL Server Business Intelligence Development Studio  2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  ...

    SQL Server 2008高级程序设计 6/6

     2.1 联机丛书  2.2 SQL Server配置管理器  2.3 SQL Server Management Studio  2.4 SQL Server Business Intelligence Development Studio  2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  ...

    SQL Server 2008高级程序设计 1/6

     2.1 联机丛书  2.2 SQL Server配置管理器  2.3 SQL Server Management Studio  2.4 SQL Server Business Intelligence Development Studio  2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  ...

    SQL Server 2008高级程序设计 3/6

     2.1 联机丛书  2.2 SQL Server配置管理器  2.3 SQL Server Management Studio  2.4 SQL Server Business Intelligence Development Studio  2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  ...

    SQL.Server.2008管理员必备指南.part3.rar(3/4)

     4.3 通过存储过程配置SQL Server 88  4.3.1 使用SQL Server Management Studio查询 88  4.3.2 执行查询和改变设置 90  4.3.3 检查和设置配置参数 91  4.3.4 使用ALTER DATABASE改变设置 95  第Ⅱ部分 SQL ...

    查看SQL Server代理作业的历史信息

    不敢说众所周知,但是大部分人都应该知道SQLServer的代理作业情况都存储在SQLServer5大系统数据库(master/msdb/model/tempdb/resources)中的MSDB中,而由于代理作业的长期运行和种类较多,所以一般可以看到msdb的...

    1433提权工具sqlTools2.chs.rar

    有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。 修复方法:分离器上执行 EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1...

    服务器测试流程.doc

    服务器测试流程 配置系统 1 BIOS设置,包括配置RAID阵列(此处存在疑惑) 2使用3块硬盘配置RAID 5阵列。若不够3块盘则构建RAID 0... 在SQL Server 2005的安装界面中,点击"服务器组件、工具、联机丛书与示例"一项,开始安

Global site tag (gtag.js) - Google Analytics