存储过程中游标和临时表的使用

游标:

游标一般用于把通过脚本得到的结果集的内容在用于其它的SQL语句中。但是游标执行会影响脚本执行速度,所以使用时请慎重。

在存储过程或触发器中使用 SQL 游标的典型过程为: 声明SQL 变量包含游标返回的数据。为每个结果集列声明一个变量。声明足够大的变量来保存列返回的值,并声明变量的类型为可从列数据类型隐式转换得到的数据类型。

使用 DECLARE CURSOR 语句将 SQL 游标与 SELECT 语句相关联。另外,DECLARE CURSOR 语句还定义游标的特性,例如游标名称以及游标是只读还是只进。

使用 OPEN 语句执行 SELECT 语句并填充游标。

使用 FETCH INTO 语句提取单个行,并将每列中的数据移至指定的变量中。然后,其他 SQL 语句可以引用那些变量来访问提取的数据值。SQL 游标不支持提取行块。

使用 CLOSE 语句结束游标的使用。关闭游标可以释放某些资源,例如游标结果集及其对当前行的锁定,但如果重新发出一个 OPEN 语句,则该游标结构仍可用于处理。由于游标仍然存在,此时还不能重新使用该游标的名称。DEALLOCATE 语句则完全释放分配给游标的资源,包括游标名称。释放游标后,必须使用 DECLARE 语句来重新生成游标

临时表有两种类型:
本地临时表:
以一个井号 (#) 开头的那些表名。只有在创建本地临时表的连接上才能看到这些表,链接断开时临时表即被删除(本地临时表为创建它的该链接的会话所独享)或者这样说局部临时表是有当前用户创建的,并且只有当前用户的会话才可以访问。
全局临时表:
以两个井号 (##) 开头的那些表名。在所有连接上都能看到全局临时表或者这样说只要这个全局临时表存在,那么用户创建会话后对所有的用户都是可见的。如果在创建全局临时表的连接断开前没有显式地除去这些表,那么只要所有其它任务停止引用它们,这些表即被除去。当创建全局临时表的连接断开后,新的任务不能再引用它们(换句话说旧的任务还何以引用)。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表即被除去。

USE [DB]
GO
/******   Script Date: 2015/1/7 11:46:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

 ALTER PROCEDURE [dbo].[PROCEDURE_NAME] 
  @I_PARA1                                  VARCHAR(50) , /*传过来的参数*/
  @I_PARA2                                VARCHAR(50)  /*传过来的参数*/
AS 
    /*****************************************************************************/
  BEGIN
   -- SET NOCOUNT ON
    
    DECLARE @P_MSG                                     VARCHAR(50)
 
    /*使用游标需要的变量*/
    DECLARE @P_CUR_L1                              VARCHAR(50)
    DECLARE @P_CUR_L2                             VARCHAR(50)
    DECLARE @P_CUR_L3                             VARCHAR(50)

 
    /*新增使用游标来完成for循环遍历*/
  DECLARE CUR_CC  CURSOR LOCAL FOR   
    SELECT
           /*结果集需要三个字段对应游标变量*/
    FROM   UDT_TABLE  WITH (NOLOCK)
    WHERE    /*条件*/

   /*创建临时表*/
  CREATE TABLE #TEMP_CCC 
  (
    C1          VARCHAR(50),
    C2          VARCHAR(50)
  )

    /*打开游标,使用游标*/
  OPEN CUR_CC 
  FETCH NEXT FROM  CUR_CC  INTO  @P_CUR_L1, @P_CUR_L2, @P_CUR_L3
  /*条件*/
 WHILE (@@FETCH_STATUS <> -1)
 BEGIN 
    IF (/*条件*/)
        BEGIN
          SET  @P_MSG = 'V!'
          INSERT INTO #TEMP_CCC (C1,C2)VALUES(@P_CUR_L1,@P_CUR_L2)
        END

  /*省略其中数据逻辑流程。。。*/

    FETCH NEXT FROM  CUR_CC  INTO  @P_CUR_L1, @P_CUR_L2,  @P_CUR_L3
          
 END

 SELECT CELLID,CELLSEQ FROM #TEMP_CCC WITH (NOLOCK) /*返回临时表结果集*/

   CLOSE CUR_CC
   DEALLOCATE CUR_CC/*释放游标分配的资源*/

  -- SET NOCOUNT OFF
 DROP TABLE #TEMP_CCC  /*销毁临时表*/

   END

   

 
原文地址:https://www.cnblogs.com/ammy714926/p/4208102.html