none
请教SQLSERVER存储过程建的全局临时表,多个人同时用会有冲突吗? RRS feed

  • 问题

  • 比如存储过程A先判断是否存在全局临时表,如果有则先删除,如果没有就建一个全局临时表##tb1,如果多个用户同时调用存储过程A会不会导致冲突,比如:用户1创建的表##tb1还没用完,就会被用户2调用这个存储过程把##tb1删了。

    由于要对##tb1表结构做修改,不能用局部临时表。

    请大家赐教,谢谢!

    2018年4月2日 7:16

答案

  • 做了测试,确实会冲突,不知道能不能解决:存储过程B建的局部临时表在存储过程A中不能修改的问题
    • 已标记为答案 Tim-2009 2018年5月31日 9:13
    2018年4月2日 7:31
  • 没发现全局临时表有什么场景适合使用,忘了它吧

    或者,有发现适合的场景,欢迎讨论沟通 


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    • 已标记为答案 Tim-2009 2018年5月31日 9:13
    2018年4月5日 14:38

全部回复

  • 做了测试,确实会冲突,不知道能不能解决:存储过程B建的局部临时表在存储过程A中不能修改的问题
    • 已标记为答案 Tim-2009 2018年5月31日 9:13
    2018年4月2日 7:31
  • Can't use local temp table?
    2018年4月2日 12:29
  • 既然是全局的,当然会冲突了。

    你可以考虑用session_id加到表名里去。如果表不大的话,也可以考虑表变量作为参数。


    想不想时已是想,不如不想都不想。

    2018年4月3日 2:50
    版主
  • Can't use local temp table?

    我要在这个存储过程A中对这个临时表做结构方面的修改,因此不能用局部临时表。

    试了MYSQL可以支持对局部临时表的修改,SQLSERVER不行

    2018年4月3日 5:12
  • 既然是全局的,当然会冲突了。

    你可以考虑用session_id加到表名里去。如果表不大的话,也可以考虑表变量作为参数。


    想不想时已是想,不如不想都不想。


    我改成不用临时表了,临时表看来行不通了
    2018年4月3日 5:13
  • 既然是全局的,肯定冲突
    用本地的(单#)吧,表结构是可以改的
    create table #t(id int);
    alter table #t add c int;
    insert #t values(1,1);
    select * from #t
    update #t set c=11;
    select * from #t
    drop table #t


    2018年4月4日 1:52
  • 没发现全局临时表有什么场景适合使用,忘了它吧

    或者,有发现适合的场景,欢迎讨论沟通 


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    • 已标记为答案 Tim-2009 2018年5月31日 9:13
    2018年4月5日 14:38
  • 这种情况属于资源竞争,你可以加入一个检查机制,在任何存储过程使用这个表的时候,做个标记,等用完后将状态修改回来,这样其他存储过程才可以继续使用,避免还没用完就被删除了。

    其实让人疑惑的是,你这里的业务场景,很难想象为啥要用一个临时表,并进行字段修改和表删除。对这个业务场景进行优化及改进可能是最好的解决办法。


    family as water

    2018年4月10日 2:46
  • 没发现全局临时表有什么场景适合使用,忘了它吧

    或者,有发现适合的场景,欢迎讨论沟通 


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴


    在需要数据交换的场合可能有用,比如说某个数据中间结果要被多个地方使用,这样就避免多次查询或者生成。

    family as water

    2018年4月10日 6:14
  • 如果使用全局临时表,使用的客户端太对的话,对他的 修改,会更对, 这样会不会造成 tempDB 的 日志文件增长太快?
    2018年5月17日 18:06