关于“游标”变量 和 “临时表”变量的疑问。问题一:
       在多个存储过程中都声明使用了名称相同的临时表,比如:
       IF OBJECT_ID('tempdb..#temptable')  IS NOT NULL
       DROP TABLE  #temptable;      这样多个存储过程,对应于不同的作业并发运行,会不会发生冲突???    发生相互影响的现象。  
问题二:
       在多个存储过程中都声明使用了[b]名称相同的游标[/b],比如:
       DECLARE Cur CURSOR FOR
      这样多个存储过程,对应于不同的作业并发运行,会不会发生冲突???

解决方案 »

  1.   

    多个存储过程都声明了临时表变量“#temptable”   和     游标变量“Cur”,如果是多个存储过程同时执行,会发生冲突吗???
      

  2.   

    问题1:
           局部临时表的话不同会话之间不会有影响,创建后在tempdb 里面会以后缀区分问题2:
           局部游标不会,全局游标会
      

  3.   


    什么是局部游标,什么又是全局游标嘞。  
    OBJECT_ID('tempdb..#temptable')  这个是全局临时表,还是局部历史表啊。
    判断它是否存在,这里也没有指定回话啊。
      

  4.   

    问题1,不会
    临时表只对当前会话有效,全局临时表##会出现冲突
    问题2:要用本地游标,不要指定全局游标(能常这是默认)
     DECLARE Cur CURSOR LOCAL FOR
      

  5.   


    什么是局部游标,什么又是全局游标嘞。  
    OBJECT_ID('tempdb..#temptable')  这个是全局临时表,还是局部历史表啊。
    判断它是否存在,这里也没有指定回话啊。
    局部游标还是全局游标可以参考#4的解释临时表的话  #TMPTB 是局部临时表,尽在当前会话有效,##TMPTB 就是全局临时表,其它会话也可以引用。
      

  6.   

    sql server的存储过程是会话级的,不同会话是透明的
    存储过程
    IF OBJECT_ID('tempdb..#temptable')  IS NOT NULL
            DROP TABLE  #temptable;
    不同调用者,互补影响
      

  7.   

    公用临时表 用两个##
    局部临时表 用一个#号
    create table ##tmp (id int)
    create table #tmp (id int)
    运行此二条命令后,再打开tempdb数据库,查看临时表
    会发现表#tmp后加了很长的后缀
    再就是说,不同连接中创建的局部临时表不会互相影响
    与公用临时表就显示,##tmp