积极答复者
存储过程临时表问题

问题
-
我在在数据库中建个存储过程,每次执行存储过程都要建个临时表得到结果集后DROP。问题来了,就是多个用户同时执行存储过程时,会不会冲突?
- 已移动 Raymond Tang 2009年12月10日 15:13 (发件人:.NET Framework 一般性问题讨论区)
答案
-
sql server 2005以上版本
创建临时表你可以采用这种方式 表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
以##开头的临时表对所有链接都有效相当于是公用的
无论是#或者##开头的临时表都是存储在数据库 temp中的 断开连接后会自动删除的 当然最好能收到删除
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
#开头的表示局部(local)临时表,作用域为用户会话,或者是存储过程.
如果在存储过程内创建局部临时表,在存储过程退出后会自动销毁. 所以即使在同一个会话中多次调用这个存储过程,也不会冲突
有dba的职位吗(北京的),请联系我 stswordman#hotmail.com- 已标记为答案 LiweiyinMicrosoft employee, Moderator 2009年12月14日 13:56
全部回复
-
你好!临时表是基于连接的(类似 Asp.net 的 Session),同时多个用户使用时会一般会开启多个连接,所以不会冲突。比如你使用两个连接同时创建或删除一个表名一样的临时表,是没有问题的。
知识改变命运,奋斗成就人生!- 已建议为答案 SQL STUDIO 2009年12月14日 13:03
-
sql server 2005以上版本
创建临时表你可以采用这种方式 表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
以##开头的临时表对所有链接都有效相当于是公用的
无论是#或者##开头的临时表都是存储在数据库 temp中的 断开连接后会自动删除的 当然最好能收到删除
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~- 已建议为答案 SQL STUDIO 2009年12月14日 13:04
-
sql server 2005以上版本
This is true in previous sql versions.
创建临时表你可以采用这种方式 表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
以##开头的临时表对所有链接都有效相当于是公用的
无论是#或者##开头的临时表都是存储在数据库 temp中的 断开连接后会自动删除的 当然最好能收到删除
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~- 已建议为答案 SQL STUDIO 2009年12月14日 13:04
-
sql server 2005以上版本
This is true in previous sql versions.
创建临时表你可以采用这种方式 表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
以##开头的临时表对所有链接都有效相当于是公用的
无论是#或者##开头的临时表都是存储在数据库 temp中的 断开连接后会自动删除的 当然最好能收到删除
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
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~~~ -
sql server 2005以上版本
创建临时表你可以采用这种方式 表名以#开头的临时表对本次链接有效 当连接断开后这表会自动删除的
以##开头的临时表对所有链接都有效相当于是公用的
无论是#或者##开头的临时表都是存储在数据库 temp中的 断开连接后会自动删除的 当然最好能收到删除
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
#开头的表示局部(local)临时表,作用域为用户会话,或者是存储过程.
如果在存储过程内创建局部临时表,在存储过程退出后会自动销毁. 所以即使在同一个会话中多次调用这个存储过程,也不会冲突
有dba的职位吗(北京的),请联系我 stswordman#hotmail.com- 已标记为答案 LiweiyinMicrosoft employee, Moderator 2009年12月14日 13:56
-
你不用担心那个问题,但如果是全局临时表##,则是全部公用的。最后drop不用要了。
建议你用表变量。因为临时表,会因引存储过程重新编译,速度会不好。
再有临时表占内存,不能太大。如果数据大到你系统盘,还会出错。
学习,学习,再学习
日志不会记录表变量,节省相应的磁盘开销
但表标量不会产生统计信息,可能导致使用了错误的执行计划。
临时表和表变量都会占用内存...sql server执行的操作都是在内存中进行的。
数据量过大,两者都会被flush到硬盘。在sqlserver2005和版本中,单个语句的重编译不会导致整个存储过程的重编译
并没有结论说表变量好过临时表,或者反之。 每个都有自己的适用范围
有dba的职位吗(北京的),请联系我 stswordman#hotmail.com