Execute方法_SQLServer

Execute方法_SQLServer

EXECUTE

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

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

语法

执行存储过程:

[ [ EXEC [ UTE ] ]
    {
        [ @return_status = ]
            { procedure_name [ ;number ] | @procedure_name_var
    }
    [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
        [ ,...n ]
[ WITH RECOMPILE ]

执行字符串:

EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )

参数

@return_status

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

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

procedure_name

是拟调用的存储过程的完全合法或者不完全合法的名称。过程名称必须符合标识符规则。有关更多信息,请参见使用标识符。无论服务器的代码页或排序方式如何,扩展存储过程的名称总是区分大小写。

用户可以执行在另一数据库中创建的过程,只要该用户拥有此过程或有在该数据库中执行它的适当的权限。用户可以在另一台运行 Microsoft® SQL Server™ 的服务器上执行过程,只要该用户有适当的权限使用该服务器(远程访问),并能在数据库中执行该过程。如果指定了服务器名称但没有指定数据库名称,SQL Server 会在用户默认的数据库中寻找该过程。

;number

是可选的整数,用于将相同名称的过程进行组合,使得它们可以用一句 DROP PROCEDURE 语句除去。该参数不能用于扩展存储过程。

在同一应用程序中使用的过程一般都以该方式组合。例如,在订购应用程序中使用的过程可以 orderproc;1orderproc;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 语句可以指定一个或者多个 @parametervalue @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

USE master EXEC ("USE pubs") SELECT * FROM authors

权限

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

示例

A. 使用 EXECUTE 传递单个参数

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

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

EXEC showind titles

在执行过程中变量可以显式命名:

EXEC showind @tabname = titles

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

showind titles

--

showind @tabname = titles

B. 使用多个参数与一个输出参数

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

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

DECLARE @percent int

EXECUTE roy_check 'BU1032', 1050, @pc = @percent OUTPUT

SET Percent = @percent

C.使用带一个变量的 EXECUTE 'tsql_string' 语句

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

说明  此例子只用作举例。

DECLARE tables_cursor CURSOR

   FOR

   SELECT name FROM sysobjects WHERE type = 'U'

OPEN tables_cursor

DECLARE @tablename sysname

FETCH NEXT FROM tables_cursor INTO @tablename

WHILE (@@FETCH_STATUS <> -1)

BEGIN

   /* A @@FETCH_STATUS of -2 means that the row has been deleted.

   There is no need to test for this because this loop drops all

   user-defined tables.   */.

   EXEC ('DROP TABLE ' + @tablename)

   FETCH NEXT FROM tables_cursor INTO @tablename

END

PRINT 'All user-defined tables have been dropped from the database.'

DEALLOCATE tables_cursor

D.使用带远程存储过程的 EXECUTE 语句

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

DECLARE @retstat int

EXECUTE @retstat = SQLSERVER1.pubs.dbo.checkcontract '409-56-4008'

E. 使用带扩展存储过程的 EXECUTE 语句

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

USE master

EXECUTE xp_cmdshell 'dir *.exe'

F. 使用带一个存储过程变量的 EXECUTE 语句

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

DECLARE @proc_name varchar(30)

SET @proc_name = 'sp_who'

EXEC @proc_name

G. 使用带 DEFAULT EXECUTE 语句

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

USE pubs

IF EXISTS (SELECT name FROM sysobjects

      WHERE name = 'proc_calculate_taxes' AND type = 'P')

   DROP PROCEDURE proc_calculate_taxes

GO

-- Create the stored procedure.

CREATE PROCEDURE proc_calculate_taxes (@p1 smallint = 42, @p2 char(1),

      @p3 varchar(8) = 'CAR')

    AS

   SELECT *

   FROM mytable

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

EXECUTE proc_calculate_taxes @p2 = 'A'

EXECUTE proc_calculate_taxes 69, 'B'

EXECUTE proc_calculate_taxes 69, 'C', 'House'

EXECUTE proc_calculate_taxes @p1 = DEFAULT, @p2 = 'D'

EXECUTE proc_calculate_taxes DEFAULT, @p3 = 'Local', @p2 = 'E'

EXECUTE proc_calculate_taxes 69, 'F', @p3 = DEFAULT

EXECUTE proc_calculate_taxes 95, 'G', DEFAULT

EXECUTE proc_calculate_taxes DEFAULT, 'H', DEFAULT

EXECUTE proc_calculate_taxes DEFAULT, 'I', @p3 = DEFAULT

请参见

+(字符串串联)

[ ](通配符字符 - 需匹配的字符)

@@NESTLEVEL

ALTER PROCEDURE

DECLARE @local_variable

DROP PROCEDURE

函数

sp_depends

sp_helptext

 

    SQL SERVER 常用存储过程

    Sp_Help  @TableName

    分析表结构,包括列,索引,约束等信息

    Sp_HelpText  @objname

    显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本

    Sp_HelpIndex  @TableName

    报告有关表或视图上索引的信息

    Sp_HelpTrigger  @TableName

    返回指定表中定义的当前数据库的触发器类型。

    Sp_Lock,  Sp_Who,  Sp_Who2

    报告有关锁的信息。

    提供关于当前 用户和进程的信息

 
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: sp_executesql是一个SQL Server系统存储过程,可以用于执行动态SQL语句并返回结果。它的语法如下: ``` sp_executesql [@stmt =] N'sql语句', [@params =] N'参数定义', [@param1 =] '值1', ... ``` 其中,@stmt是要执行的SQL语句,@params是一个可选的字符串,用于定义参数。参数定义是一个以逗号分隔的字符串列表,每个参数由其名称、数据类型和方向组成。如果SQL语句中包含参数占位符(例如@parameter_name),则必须在@params字符串中定义该参数。然后,可以在@stmt中使用参数占位符来引用这些参数。 例如,以下代码演示了如何使用sp_executesql执行动态SQL语句,其中包含一个参数占位符: ``` DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM my_table WHERE id = @id' DECLARE @id INT = 1 EXEC sp_executesql @sql, N'@id INT', @id ``` 在上面的示例中,@sql包含要执行的SQL语句,其中包含一个参数占位符@id。然后,使用sp_executesql执行该语句,并将参数@id传递给它。这将返回my_table表中id为1的行。 ### 回答2: sp_executesql是用于在SQL Server数据库中执行动态SQL语句的系统存储过程。它提供了一种安全、高效的方式来执行动态生成的SQL语句,可以将参数传递给动态SQL语句,以避免SQL注入攻击,并且可以在执行相同的SQL语句时重用执行计划,提高性能。 sp_executesql的基本语法如下: sp_executesql [@stmt =] N'sql语句', [@params =] N'参数定义', [@param1 =] 值1, [@param2 =] 值2, ... 其中,@stmt是动态SQL语句的字符串,@params是定义参数的字符串,参数定义使用@参数名和数据类型的形式。 通过使用sp_executesql,可以将参数传递给动态SQL语句,以避免SQL注入攻击。例如,可以在动态SQL语句中使用参数@name来执行查询操作: DECLARE @name NVARCHAR(50) = N'John' DECLARE @sql NVARCHAR(1000) SET @sql = N'SELECT * FROM Customers WHERE CustomerName = @name' EXEC sp_executesql @sql, N'@name NVARCHAR(50)', @name 使用sp_executesql的另一个优点是,它可以在执行相同的SQL语句时重用执行计划,提高性能。例如,可以使用sp_executesql来执行一个频繁执行的动态SQL语句: DECLARE @sql NVARCHAR(1000) SET @sql = N'SELECT * FROM Orders WHERE OrderDate >= @startDate' EXEC sp_executesql @sql, N'@startDate DATETIME', '2022-01-01' EXEC sp_executesql @sql, N'@startDate DATETIME', '2022-02-01' 在执行第二个EXEC sp_executesql语句时,由于执行计划已经在第一个执行中生成,数据库引擎可以重用该计划,从而节省了资源和时间。 总之,sp_executesqlSQL Server数据库中的一个重要工具,可以安全、高效地执行动态SQL语句,并通过参数化和执行计划的重用提高性能。 ### 回答3: sp_executesql是一个存储过程,用于执行动态SQL语句。它可以接收动态生成的SQL语句以及参数列表作为输入,并执行这些语句。这个存储过程的语法如下: sp_executesql [@stmt =] N'sql语句', -- 需要执行的动态SQL语句 [@params =] N'参数定义列表', -- 参数列表的定义,包括参数的名称、数据类型和长度等信息 [@param1 =] '值1', -- 参数1 [@param2 =] '值2', -- 参数2 ... [@paramN =] '值N' -- 参数N 通过使用sp_executesql存储过程,我们可以在运行时动态生成SQL语句并将参数传递给它,从而实现更灵活的查询和操作数据库。使用sp_executesql的好处之一是可以防止SQL注入攻击,因为参数是作为参数传递给SQL语句,而不是直接拼接到字符串中。 在使用sp_executesql时,我们首先需要提供要执行的动态SQL语句,并使用参数占位符(如@ParamName)来表示需要传递的参数。然后,我们可以定义参数列表,包括参数的名称、数据类型和长度等信息。最后,我们可以通过传递参数的值来执行动态SQL语句。 例如,假设我们需要根据传入的城市名称查询员工信息。我们可以使用sp_executesql执行以下动态SQL语句: DECLARE @city NVARCHAR(50) SET @city = '北京' DECLARE @sql NVARCHAR(1000) SET @sql = N'SELECT * FROM Employee WHERE City = @CityParam' EXEC sp_executesql @sql, N'@CityParam NVARCHAR(50)', @CityParam = @city 通过这种方式,我们可以根据传入的城市名称动态生成SQL语句,并将参数传递给它,从而实现根据不同的城市查询员工信息的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值