SQL语句中GO和EXEC是什么意思
GO
⽤信号通知 Microsoft® SQL Server™ 实⽤⼯具⼀批 Transact-SQL 语句的结束。
语法
GO
注释
GO 不是 Transact-SQL 语句;⽽是可为 osql 和 isql 实⽤⼯具及 SQL Server 查询分析器识别的命令。
SQL Server 实⽤⼯具将 GO 解释为应将当前的 Transact-SQL 批处理语句发送给 SQL Server 的信号。当前批处理语句是⾃上⼀ GO 命令后输⼊的所有语句,若是第⼀条 GO 命令,则是从特殊会话或脚本的开始处到这条 GO 命令之间的所有语句。SQL 查询分析器
和 osql 及 isql 命令提⽰实⽤⼯具执⾏ GO 命令的⽅式不同。有关更多信息,请参见 osql 实⽤⼯具、isql 实⽤⼯具和 SQL 查询分析器。 GO 命令和Transact-SQL 语句不可在同⼀⾏上。但在 GO 命令⾏中可包含注释。
⽤户必须遵照使⽤批处理的规则。例如,在批处理中的第⼀条语句后执⾏任何存储过程必须包含 EXECUTE 关键字。局部(⽤户定义)变量的作⽤域限制在⼀个批处理中,不可在 GO 命令后引⽤。
USE pubs
GO
DECLARE @MyMsg VARCHAR(50)
SELECT @MyMsg = 'Hello, World.'
GO -- @MyMsg is not valid after this GO ends the batch.
-- Yields an error because @MyMsg not declared in this batch.
PRINT @MyMsg
GO
SELECT @@VERSION;
-- Yields an error: Must be EXEC sp_who if not first statement in
-- batch.
sp_who
GO
SQL Server 应⽤程序可将多条 Transact-SQL 语句作为⼀个批处理发给 SQL Server 去执⾏。在此批处理中的语句编译成⼀个执⾏计划。程序员在 SQL Server 实⽤⼯具中执⾏特定语句,或⽣成 Transact-SQL 语句脚本在 SQL Server 实⽤⼯具中运⾏,⽤ GO 来标识批处理的结束。
如果基于 DB-Library、ODBC 或 OLE DB APIs 的应⽤程序试图执⾏ GO 命令时会收到语法错误。SQL Server 实⽤⼯具永远不会向服务器发送 GO 命令。
权限
GO 是⼀个不需权限的实⽤⼯具命令。可以由任何⽤户执⾏。
⽰例
下⾯的⽰例创建两个批处理。第⼀个批处理只包含⼀条 USE pubs 语句,⽤于设置数据库上下⽂。剩
下的语句使⽤了⼀个局部变量,因此所有的局部变量声明必须在⼀个批处理中。这⼀点可通过在最后⼀条引⽤此变量的语句之后才使⽤ GO 命令来做到。
USE pubs
GO
DECLARE @NmbrAuthors int
SELECT @NmbrAuthors = COUNT(*)
FROM authors
PRINT 'The number of authors as of ' +
CAST(GETDATE() AS char(20)) + ' is ' +
CAST(@NmbrAuthors AS char (10))
GO
--------------------------------------------------------
EXECUTE
执⾏标量值的⽤户定义函数、系统过程、⽤户定义存储过程或扩展存储过程。同时⽀持 Transact-SQL 批处理内的字符串的执⾏
语法
执⾏存储过程:
[ [ 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
是拟调⽤的存储过程的完全合法或者不完全合法的名称。过程名称必须符合标识符规则。有关更多信息,请参见使⽤标识符。⽆论服务器的代码页或排序⽅式如何,扩展存储过程的名称总是区分⼤⼩写。
高压svg是什么⽤户可以执⾏在另⼀数据库中创建的过程,只要该⽤户拥有此过程或有在该数据库中执⾏它的适当的权限。⽤户可以在另⼀台运
软件测试是采用什么执行软件的活动⾏ Microsoft® SQL Server™ 的服务器上执⾏过程,只要该⽤户有适当的权限使⽤该服务器(远程访问),并能在数据库中执⾏该过程。如果指定了服务器名称但没有指定数据库名称,SQL Server 会在⽤户默认的数据库中寻该过程。
;number
是可选的整数,⽤于将相同名称的过程进⾏组合,使得它们可以⽤⼀句 DROP PROCEDURE 语句除去。该参数不能⽤于扩展存储过程。 在同⼀应⽤程序中使⽤的过程⼀般都以该⽅式组合。例如,在订购应⽤程序中使⽤的过程可以 orderproc;1、orderproc;2 等来命名。DROP PROCEDURE orderproc 语句将除去整个组。在对过程分组后,不能除去组中的单个过程。例
如,DROP PROCEDURE orderproc;2 是不允许的。有关过程组的更多信息,请参见 CREATE PROCEDURE。
@procedure_name_var
是局部定义变量名,代表存储过程名称。
@parametermysql语句的执行顺序
是过程参数,在 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 可以是 char、varchar、nchar 或 nvarchar 数据类型,最⼤值为服务器的可⽤内存。如果字符串长度超过 4,000 个字符,则把多个局部变量串联起来⽤于 EXECUTE 字符串。有关系统提供的 SQL Server 数据类型更多的信息,请参见数据类型。if复合函数的使用方法
[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 语句内的语句。
用字符指针实现函数strlen的功能数据库环境的更改只在 EXECUTE 语句结束前有效。例如,在这个例⼦的 EXEC 后,数据库环境是 master:vxlan二层网络三层网络
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
--------------------------------------------------------
接分
--------------------------------------------------------
GO
⽤信号通知 Microsoft® SQL Server™ 实⽤⼯具⼀批 Transact-SQL 语句的结束。
EXECUTE
执⾏标量值的⽤户定义函数、系统过程、⽤户定义存储过程或扩展存储过程。同时⽀持 Transact-SQL 批处理内的字符串的执⾏
若要唤醒调⽤函数,请使⽤ EXECUTE stored_procedure 中描述的语法。
exec 就是execute的缩写,对关键字的解释在联机帮助上都有⽐较明确的解释,反倒是⼀些sql的基础书籍上很少会详细解释这些东西,呵呵,不过也理解,如果⼀本书都是这些东西,那真是骗钱的书了。
-
--------------------------------------------------
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论