多用户生成同名临时表

Jenf_Mu 2011-07-05 10:07:01
所有在网页端连接数据库都是以Windows认证方式。所有人的SQL语句里都有类似
if object_id('tempdb..#tPrjs') is not null
Begin
drop table #tPrjs
End
这样的语句,用户之间的会不会冲突,还是SQL Server会为每个用户的每次SQL语句生成不同的临时表(虽然名字一样)。


至于我为什么要用大量的临时表,比如用户查询出A工程下的所有控制点,在另一个页面他可以编辑A工程下他自己有权限的控制点,如果不用临时表,我只能再在数据库里查一遍A工程下所包含的控制点且当前用户有权限的控制点。如果不用临时表,自己在程序端逐条对比dataset里的数据,可行吗?
...全文
325 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
勿勿 2011-07-28
  • 打赏
  • 举报
回复
不会冲突,conn.open()要注意close()。这样可以提高查询性能!!
mycodeis0000 2011-07-28
  • 打赏
  • 举报
回复
学习了
liangyong1107 2011-07-19
  • 打赏
  • 举报
回复
临时表,不会引起冲突的
xlz923 2011-07-19
  • 打赏
  • 举报
回复
学习了
sdmc01 2011-07-18
  • 打赏
  • 举报
回复
我之前也提过这个问题,高手给提说法是##临时表会,#临时表不会
yubofighting 2011-07-10
  • 打赏
  • 举报
回复
局部临时表不会冲突,全局临时表会
Andy-W 2011-07-08
  • 打赏
  • 举报
回复
if object_id('tempdb..#tPrjs') is not null
Begin
drop table #tPrjs
End
这样的语句,用户之间的会不会冲突,还是SQL Server会为每个用户的每次SQL语句生成不同的临时表(虽然名字一样)。

回答是不會衝突的,SQL Server會對不同會話,創建以“#tPrjs”為前綴的,不同的臨時表。我們可以做個簡單的例子來說明這一問題,這樣就能一目了然了:

在SQL Server Management Studio(SSMS)新增一個查詢(會話):
use Test
Go
if object_id('tempdb..#tPrjs') is not null
drop table #tPrjs

Create table #tPrjs(id int )
Go


再新增第二個查詢(會話):

use Test
Go
if object_id('tempdb..#tPrjs') is not null
drop table #tPrjs

Create table #tPrjs(id int )
Go


然後,再新增第三個查詢(會話),查臨時數據庫tempdb,剛創建的臨時表#tPrjs:
use tempdb
Go

Select name,object_id,create_date From sys.tables Where name like '#tPrjs%'


我們就可以發現這樣的一個很有意思的結果:


name object_id create_date
---------------------------------------------------------------
#tPrjs________0000000006BF 1240391488 2011-07-08 16:04:25.763
#tPrjs________0000000006C0 1256391545 2011-07-08 16:04:29.757

/* #tPrjs________0000000006BF 中間有很長的下劃綫 */


這裡就看到生成了不同的表對象,可以從Name 或 object_id就可以判斷。這一簡單的例子也驗證了樓主的疑惑了。


yuerjiajia 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qianjin036a 的回复:]

引用 7 楼 yuerjiajia 的回复:
一个#号的临时表只对当前连接存在 你的实现应该是一个用户就会创建一个数据库连接 所以不会有冲突的

不一定.
对于用B/S结构的网站来说,访问数据库的用户只有一个,那就是写在连接字符串中的那个用户名,而非访问这个页面的那个用户.而连接字符串是写在程序里的,不是由用户写的.
[/Quote]
虽然说BS架构的软件都是使用一个用户名密码进行连接数据库 但是只要用的不是连接池模式 两个用户其实是两个连接 可用查询分析器测试之
-晴天 2011-07-05
  • 打赏
  • 举报
回复
这个故事告诉我们:
set conn=....
conn.open
set rs=conn.execute(...
然后 一定要用:
rs.close
set rs=nothing
conn.close
set conn=nothing
-晴天 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yuerjiajia 的回复:]
一个#号的临时表只对当前连接存在 你的实现应该是一个用户就会创建一个数据库连接 所以不会有冲突的
[/Quote]
不一定.
对于用B/S结构的网站来说,访问数据库的用户只有一个,那就是写在连接字符串中的那个用户名,而非访问这个页面的那个用户.而连接字符串是写在程序里的,不是由用户写的.
kingtiy 2011-07-05
  • 打赏
  • 举报
回复
不会冲突的.在各自的会话里的呢.不是全局的.
有一种是全局的.##t
这种就会.
yuerjiajia 2011-07-05
  • 打赏
  • 举报
回复
一个#号的临时表只对当前连接存在 你的实现应该是一个用户就会创建一个数据库连接 所以不会有冲突的
cd731107 2011-07-05
  • 打赏
  • 举报
回复
不影响的,提高了查询性能
bancxc 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 orchidcat 的回复:]

临时表的话,没有必要验证。每次会话结束就释放了。
[/Quote]也可以提高性能
Mr_Nice 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jenf_mu 的回复:]

引用 2 楼 fredrickhu 的回复:

是一样的名字么??有可能会引发并发性的问题

是啊,都是以 if object_id('tempdb..#tPrjs') is not null这样的名字啊
[/Quote]

临时表的话,没有必要验证。每次会话结束就释放了。
Jenf_Mu 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]

是一样的名字么??有可能会引发并发性的问题
[/Quote]
是啊,都是以 if object_id('tempdb..#tPrjs') is not null这样的名字啊
--小F-- 2011-07-05
  • 打赏
  • 举报
回复
是一样的名字么??有可能会引发并发性的问题
快溜 2011-07-05
  • 打赏
  • 举报
回复
不会冲突,不过临时表太多,会影响系统性能。消耗资源。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧