Transact-SQL中游标名的作用域
来源:互联网 发布:剑灵读图慢怎么优化 编辑:程序博客网 时间:2024/06/17 15:01
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
Microsoft2000支持关键字GLOBAL和LOCAL用于DECLARECURSOR语句中游标名作用域的定义。GLOBAL指定游标名在一个连接中是全局的。LOCAL指定游标名在存储过程,触发器,包含DECLARECURSOR的批处理语句中是局部的。
MicrosoftSQLServer7.0版本以前,在一个连接中,游标名都是全局的。你必须先执行一个用于创建游标的存储过程,然后再执行另外一个从该游标中读取记录的存储过程。如:
USEpubs
GO
CREATEPROCEDUREOpenCrsrAS
DECLARESampleCrsrCURSORFOR
SELECTau_lname
FROMauthors
WHEREau_lnameLIKE'S%'
OPENSampleCrsr
GO
CREATEPROCEDUREReadCrsrAS
FETCHNEXTFROMSampleCrsr
WHILE(@@FETCH_STATUS<>-1)
BEGIN
FETCHNEXTFROMSampleCrsr
END
GO
EXECOpenCrsr/*声明并打开游标SampleCrsr.*/
GO
EXECReadCrsr/*从游标SampleCrsr中读取记录.*/
GO
CLOSESampleCrsr
GO
DEALLOCATESampleCrsr
GO
局部游标在存储过程和触发器中对游标起着重要的保护作用。全局游标能在定义它们的存储过程或触发器外被访问。因此,它们可能在不经意的时候,在存储过程和触发器外被改变。局部游标显得更,因为它们不会在存储过程和触发器外被改变,除非特地的通过输出游标参数被传递给调用者。
因为全局游标可以在存储过程和触发器以外被引用,所以它们可能对其他语句有不可预期的影响。例如:一个存储过程创建一个全局游标xyz,过程运行结束后游标xyz仍然处于打开状态,如果程序其他部分又想声明一个全局游标并命名为xyz,这时,就会发生一个重复定义的错误。
全局和局部游标具有不同的命名空间,所以,在同一时间可以出现两个具有同样名字的全局和局部游标。Transact-SQL语法支持游标参数,同样也支持使用GLOBAL标识游标的作用域。如果一个游标名同时表示全局游标和局部游标,在没有指定为GLOBAL时,此游标名将引用局部游标。
选项defaulttolocalcursor控制由未指定GLOBAL和LOCAL选项的DECLARECURSOR语句创建的游标的默认作用域。如果defaulttolocalcursor选项为真,则为局部游标,反之为全局。SQLServer2000中,defaulttolocalcursors选项默认为false,用于保持与先前版本一致。
声明并且打开局部游标的存储过程,可以将这些游标传出给调用它的存储过程,触发器和批处理语句。这可以通过一个定义为输出参数的CURSORVARYING数据类型实现。当存储过程执行结束时,游标必须打开,用以通过输出参数返回。我们可以用一个定义为CURSOR类型的局部变量引用它。
USEpubs
GO
/*Createaprocedurewithacursoroutputparameter.*/
CREATEPROCEDUREOpenCrsr@OutCrsrCURSORVARYINGOUTPUTAS
SET@OutCrsr=CURSORFOR
SELECTau_lname
FROMauthors
WHEREau_lnameLIKE'S%'
OPEN@OutCrsr
GO
/*声明局部游标.*/
DECLARE@CrsrVarCURSOR
/*将先前的游标赋给局部变量.*/
EXECOpenCrsr@OutCrsr=@CrsrVarOUTPUT
/*利用@CrsrVar去读取记录.*/
FETCHNEXTFROM@CrsrVar
WHILE(@@FETCH_STATUS<>-1)
BEGIN
FETCHNEXTFROM@CrsrVar
END
CLOSE@CrsrVar
DEALLOCATE@CrsrVar
GO
数据库API并不支持输出游标参数的存储过程。一个包含输出游标参数的存储过程不能直接被数据库API执行。这些存储过程之可以被其他的存储过程,触发器,Transact-SQL批处理,脚本调用执行。共2页 1
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
Microsoft2000支持关键字GLOBAL和LOCAL用于DECLARECURSOR语句中游标名作用域的定义。GLOBAL指定游标名在一个连接中是全局的。LOCAL指定游标名在存储过程,触发器,包含DECLARECURSOR的批处理语句中是局部的。
MicrosoftSQLServer7.0版本以前,在一个连接中,游标名都是全局的。你必须先执行一个用于创建游标的存储过程,然后再执行另外一个从该游标中读取记录的存储过程。如:
USEpubs
GO
CREATEPROCEDUREOpenCrsrAS
DECLARESampleCrsrCURSORFOR
SELECTau_lname
FROMauthors
WHEREau_lnameLIKE'S%'
OPENSampleCrsr
GO
CREATEPROCEDUREReadCrsrAS
FETCHNEXTFROMSampleCrsr
WHILE(@@FETCH_STATUS<>-1)
BEGIN
FETCHNEXTFROMSampleCrsr
END
GO
EXECOpenCrsr/*声明并打开游标SampleCrsr.*/
GO
EXECReadCrsr/*从游标SampleCrsr中读取记录.*/
GO
CLOSESampleCrsr
GO
DEALLOCATESampleCrsr
GO
局部游标在存储过程和触发器中对游标起着重要的保护作用。全局游标能在定义它们的存储过程或触发器外被访问。因此,它们可能在不经意的时候,在存储过程和触发器外被改变。局部游标显得更,因为它们不会在存储过程和触发器外被改变,除非特地的通过输出游标参数被传递给调用者。
因为全局游标可以在存储过程和触发器以外被引用,所以它们可能对其他语句有不可预期的影响。例如:一个存储过程创建一个全局游标xyz,过程运行结束后游标xyz仍然处于打开状态,如果程序其他部分又想声明一个全局游标并命名为xyz,这时,就会发生一个重复定义的错误。
全局和局部游标具有不同的命名空间,所以,在同一时间可以出现两个具有同样名字的全局和局部游标。Transact-SQL语法支持游标参数,同样也支持使用GLOBAL标识游标的作用域。如果一个游标名同时表示全局游标和局部游标,在没有指定为GLOBAL时,此游标名将引用局部游标。
选项defaulttolocalcursor控制由未指定GLOBAL和LOCAL选项的DECLARECURSOR语句创建的游标的默认作用域。如果defaulttolocalcursor选项为真,则为局部游标,反之为全局。SQLServer2000中,defaulttolocalcursors选项默认为false,用于保持与先前版本一致。
声明并且打开局部游标的存储过程,可以将这些游标传出给调用它的存储过程,触发器和批处理语句。这可以通过一个定义为输出参数的CURSORVARYING数据类型实现。当存储过程执行结束时,游标必须打开,用以通过输出参数返回。我们可以用一个定义为CURSOR类型的局部变量引用它。
USEpubs
GO
/*Createaprocedurewithacursoroutputparameter.*/
CREATEPROCEDUREOpenCrsr@OutCrsrCURSORVARYINGOUTPUTAS
SET@OutCrsr=CURSORFOR
SELECTau_lname
FROMauthors
WHEREau_lnameLIKE'S%'
OPEN@OutCrsr
GO
/*声明局部游标.*/
DECLARE@CrsrVarCURSOR
/*将先前的游标赋给局部变量.*/
EXECOpenCrsr@OutCrsr=@CrsrVarOUTPUT
/*利用@CrsrVar去读取记录.*/
FETCHNEXTFROM@CrsrVar
WHILE(@@FETCH_STATUS<>-1)
BEGIN
FETCHNEXTFROM@CrsrVar
END
CLOSE@CrsrVar
DEALLOCATE@CrsrVar
GO
数据库API并不支持输出游标参数的存储过程。一个包含输出游标参数的存储过程不能直接被数据库API执行。这些存储过程之可以被其他的存储过程,触发器,Transact-SQL批处理,脚本调用执行。共2页 1
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- Transact-SQL中游标名的作用域
- Transact-SQL中游标名的作用域
- Transact-SQL 游标名称的作用域
- Transact-SQL游标是如何工作的
- 【Transact-SQL】让人快遗忘的游标
- Transact-SQL 游标
- Transact-SQL 游标
- Transact-SQL Cursor (数据库游标)
- Transact-SQL中自定义函数的限制
- Transact-SQL中自定义函数的限制
- Transact-SQL中自定义函数的限制
- SQL 的from中嵌套的子查询的临时表名的作用域问题
- Oracle PL/SQL中游标声明中表名动态变化的方法
- Transact-SQL不使用游标的两个循环方法_SQL技巧
- 编写的Transact-SQL
- VS2010中Transact-SQL编辑器的键盘快捷键无法修改
- 编写安全的 Transact-SQL
- 编写安全的 Transact-SQL
- Spring事务处理的两种方式
- 最佳SQL基础
- 实现千万级数据的分页显示--整理资料并测试(转)
- 交叉查询的sql
- spring 编程入门十大问题解答
- Transact-SQL中游标名的作用域
- 查询分析器不能单步调试的的原因
- 移植注意事项
- Sql server一些常见性能问题的总结
- 对一大表(百万级以上)建立索引时应当注意的事项及提高性能的手段
- 查询中的N条记录,然后,对这N条记录排序
- 执行带嵌入参数的sql——sp_executesql
- Struts+Hibernate+MySql
- 封装游标存储过程(Pr_execsql2)