mysql存储过程里面如果用到一个临时表 
存储过程里面有一个判断是这个临时表是否存在如果存在就删除然后在创建
我想问的是如果当一个用户操作调用到这个存储过程还未关闭连接时 
另外一个用户也操作到这个存储过程了 那存储过程会去判断这个临时表是否存在
那么这时临时表肯定是存在的  就会执行删除操作 删掉以后会不会对前面一个用户造成影响?
如果有会是什么影响?  sql里面如果用到这样会不会也有这种影响?

解决方案 »

  1.   

    不知道我说明白没有 if object_id('tempdb..##temp') is not null 
    Begin
        drop table ##temp
    end
    就像这样?如果一个用户正在连接 那么这个##temp表就创建了 又有一个用户来连接 然后会执行删除操作?
    这样会有影响吗对前一个用户? 没有影响的话 数据库是怎么来处理的?
      

  2.   

    是MSSQL还是MYSQL??
    MSSQL中,不同连线(session)可以有同名临时表的,
    在tempdb里有另外的名称,由SQL Server自行管理的.
    所以不会有冲突.
      

  3.   

    如果是mysql勒?  在就是下面的兄弟和你说的好像有点矛盾 
    能否请大虾解决下小弟的疑问  谢谢了
      

  4.   

    测试代码如下,供参考.-- 连线1执行
    create table #temp (x int)-- 连线2执行
    create table #temp (x int)-- 查询临时表,其实有另外的名称,由系统自行管理维护的.
    select name,id,crdate 
    from tempdb.dbo.sysobjects 
    where xtype='U' and name like '#temp%'name                    id          crdate
    ------------------------ ----------- -----------------------
    #temp______0000000002CD 383340430   2011-07-29 17:25:12.653
    #temp______0000000002CE 399340487   2011-07-29 17:25:31.170
      

  5.   

    我的疑问正在此 主要是我不清楚数据库执行的机制 不知道数据库本身遇到这样问题会做个处理还是什么?
    就像ls大哥说的一样 sql里面不同连线(session)可以有同名临时表的,
    在tempdb里有另外的名称,由SQL Server自行管理的.
    那么mysql了?
      

  6.   

    至于MYSQL, 测试一下不就知道咯? 很简单的测试.
      

  7.   

    但是我用的是全局的 ##temp 这样会有影响不?  mysql里面会有问题吗?
      

  8.   

    谢谢园丁   呵呵 想问下在mysql里面会有问题吗?
      

  9.   

    让你见笑了  mysql是今天在接触的  好的mysql和sql里面语法大部分都是相同的
      

  10.   

    MYSQL不清楚,楼主是全局临时表?
      

  11.   

    全局的临时表就不是在tempdb下了,是在当前DB里的,
    而且跟普通表的作用域一致的,这样就会有冲突.
      

  12.   


    在SQL中,全局临时表不行,和局部临时表不一样!会发生阻塞的。
      

  13.   


    但是我在测试的时候 如果不用全局的就会报对象名 '#temp' 无效。
    不知道为什么会找不到这个#temp临时表?这是什么原因额?
      

  14.   


    --可以做个测试-->局部临时表测试
    -->第一个查询窗口
    begin tran
        create table #tb(id int)
    -->第二个查询窗口
    create table #tb(id int)--发现:执行完第一个查询窗口后执行第二个窗口是可以成功的。-->全局临时表
    --把上边的#tb换成##tb,发现第二个窗口会阻塞!
      

  15.   

     明白了  谢谢园丁额  
    不知道大家如果是在mysql里面用到临时表是怎么处理的? 
    如果不用临时表 又怎么做?
      

  16.   

    不用临时表就把之前用临时表写的SQL中将临时表替换成创建的SQL语句即可,当做子查询。
      

  17.   


    MySQL中的临时表使用方法创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字:CREATE TEMPORARY TABLE tmp_table 
    (
    name VARCHAR(10) NOT NULL,
    value INTEGER NOT NULL
    )
    临时表将在你连接MySQL期间存在。
    当你断开时,MySQL将自动删除表并释放所用的空间。
    当然你可以在仍然连接的时候删除表并释放空间。DROP TABLE tmp_table如果在你创建名为tmp_table临时表时名为tmp_table的表在数据库中已经存在,
    临时表将有必要屏蔽(隐藏)非临时表tmp_table。
    如果你声明临时表是一个HEAP表,MySQL也允许你指定在内存中创建它:CREATE TEMPORARY TABLE tmp_table 
    (
    name VARCHAR(10) NOT NULL,
    value INTEGER NOT NULL
    ) TYPE = HEAP因为HEAP表存储在内存中,你对它运行的查询可能比磁盘上的临时表快些。
    然而,HEAP表与一般的表有些不同,且有自身的限制。貌似和MS-SQL SERVER中差距不大。
      

  18.   

    ##是全局临时表,是公用的,一旦重启服务或被删除后就无法再引用了,
    存储过程中一般不创建全局临时表,除非是存储过程中包含有动态语句,
    动态语句引用了临时表,并且这个临时表在结束了动态语句的执行后,
    存储过程还要继续引用,这时必须要使用全局临时表了,
    但存储过程的最后会删除这个全局临时表,并且在前面生成全局临时表时,
    会生成一个当前库没有的全局临时表,避免冲突。
    mysql只接触过一点点,具体怎么操作不太清楚
      

  19.   

    对不起大家 放假寝室没网   
    等等就结贴 问下大家
    存储过程里面先执行这个动态语句(为临时表插如数据) 现在数据都成功了
    为什么接下来的查询会什么都没有?是不是动态语句一执行完这个临时表就销毁了?
    exec (@intotemp)
    select * from #temp
      

  20.   

    你在外部创建临时表,动态里面往临时表里插入数据,然后去查询会有的。
    exec('select 1 as c into #tb')select * from #tb/*********消息 208,级别 16,状态 0,第 3 行
    对象名  '#tb' 无效。create table #tb(id int)exec('insert into #tb select 1')select * from #tbdrop table #tb/**********id
    -----------
    1(1 行受影响)
      

  21.   

    用exec 执行时,会打开另一个会话(系统处理的,你不用去管它),在程序中写着 exec 语句的会话中建立的局部临时表,在 exec 语句打开的新会话中是找不到的.