none
存储过程临时表问题 RRS feed

  • 问题

  • 我在在数据库中建个存储过程,每次执行存储过程都要建个临时表得到结果集后DROP。问题来了,就是多个用户同时执行存储过程时,会不会冲突?
    • 已移动 Raymond Tang 2009年12月10日 15:13 (发件人:.NET Framework 一般性问题讨论区)
    2009年12月10日 4:08

答案

  • sql server 2005以上版本
    创建临时表你可以采用这种方式  表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
    以##开头的临时表对所有链接都有效相当于是公用的

    无论是#或者##开头的临时表都是存储在数据库 temp中的  断开连接后会自动删除的  当然最好能收到删除
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~

    #开头的表示局部(local)临时表,作用域为用户会话,或者是存储过程.
    如果在存储过程内创建局部临时表,在存储过程退出后会自动销毁. 所以即使在同一个会话中多次调用这个存储过程,也不会冲突

    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2009年12月11日 1:54
    版主

全部回复

  • 你好!

    临时表是基于连接的(类似 Asp.net 的 Session),同时多个用户使用时会一般会开启多个连接,所以不会冲突。

    比如你使用两个连接同时创建或删除一个表名一样的临时表,是没有问题的。

    知识改变命运,奋斗成就人生!
    • 已建议为答案 SQL STUDIO 2009年12月14日 13:03
    2009年12月10日 5:23
  • sql server 2005以上版本
    创建临时表你可以采用这种方式  表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
    以##开头的临时表对所有链接都有效相当于是公用的

    无论是#或者##开头的临时表都是存储在数据库 temp中的  断开连接后会自动删除的  当然最好能收到删除
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    • 已建议为答案 SQL STUDIO 2009年12月14日 13:04
    2009年12月10日 15:11
  • sql server 2005以上版本
    创建临时表你可以采用这种方式  表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
    以##开头的临时表对所有链接都有效相当于是公用的

    无论是#或者##开头的临时表都是存储在数据库 temp中的  断开连接后会自动删除的  当然最好能收到删除
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    This is true in previous sql versions.
    • 已建议为答案 SQL STUDIO 2009年12月14日 13:04
    2009年12月10日 16:02
  • sql server 2005以上版本
    创建临时表你可以采用这种方式  表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
    以##开头的临时表对所有链接都有效相当于是公用的

    无论是#或者##开头的临时表都是存储在数据库 temp中的  断开连接后会自动删除的  当然最好能收到删除
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    This is true in previous sql versions.

    yes,you are right~~~  when i learn sql server,I start with Sql server 2005 ,so i am not familiar with the previous versions
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年12月11日 1:19
  • sql server 2005以上版本
    创建临时表你可以采用这种方式  表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
    以##开头的临时表对所有链接都有效相当于是公用的

    无论是#或者##开头的临时表都是存储在数据库 temp中的  断开连接后会自动删除的  当然最好能收到删除
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~

    #开头的表示局部(local)临时表,作用域为用户会话,或者是存储过程.
    如果在存储过程内创建局部临时表,在存储过程退出后会自动销毁. 所以即使在同一个会话中多次调用这个存储过程,也不会冲突

    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2009年12月11日 1:54
    版主
  • 你不用担心那个问题,但如果是全局临时表##,则是全部公用的。最后drop不用要了。
    建议你用表变量。因为临时表,会因引存储过程重新编译,速度会不好。
    再有临时表占内存,不能太大。如果数据大到你系统盘,还会出错。
    学习,学习,再学习
    2009年12月11日 2:38
  • 表名以单个#开头, 不会有冲突
    以>1个#开头, 或者不以#开头, 会有冲突

    另外, 临时表至少在2000就有了, 不是2005以上
    2009年12月11日 4:16
  • 谢谢各位
    2009年12月11日 4:32
  • 你不用担心那个问题,但如果是全局临时表##,则是全部公用的。最后drop不用要了。
    建议你用表变量。因为临时表,会因引存储过程重新编译,速度会不好。
    再有临时表占内存,不能太大。如果数据大到你系统盘,还会出错。
    学习,学习,再学习

    日志不会记录表变量,节省相应的磁盘开销
    但表标量不会产生统计信息,可能导致使用了错误的执行计划。
    临时表和表变量都会占用内存...sql server执行的操作都是在内存中进行的。
    数据量过大,两者都会被flush到硬盘。

    在sqlserver2005和版本中,单个语句的重编译不会导致整个存储过程的重编译

    并没有结论说表变量好过临时表,或者反之。 每个都有自己的适用范围


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2009年12月12日 10:48
    版主
  • 但是单个语句的重编译也是带来很多CPU开销的。如果数据较少,通常推荐使用表变量。如果担心执行计划,可以强制指定执行计划。
    想不想时已是想,不如不想都不想。
    2009年12月13日 5:42
    版主