关于ADOQuery创建SQL临时表的怪现象,求解释!ADOQuery1和ADOQuery2的Connection是一样的现象一:ADOQuery2不
关于ADOQuery创建SQL临时表的怪现象,求解释! ADOQuery1和ADOQuery2的Connection是一样的 现象一:ADOQuery2不可以访问ADOQuery1创建的临时表#test
with ADOQuery1 do begin Close; SQL.Text :='select * into #test from poshls where FBillNo=:BillNo '; Parameters.ParamByName('BillNo').Value:='A00127101'; ExecSQL; end ; with ADOQuery2 do begin Close; SQL.Text := 'select * from #test '; Open; end;现象二:ADOQuery2可以访问ADOQuery1创建的临时表#test
with ADOQuery1 do begin Close; SQL.Text :='select * into #test from poshls where FBillNo='+QuotedStr('A00127101'); ExecSQL; end ; with ADOQuery2 do begin Close; SQL.Text := 'select * from #test '; Open; end;为什么会出现这两种不同情况呢?
我用以下语句分别查询了这两种情况:
select * from tempdb..sysobjects order by crdate desc 现象一的结果是
现象二的结果是
特别显眼的是现象一中Name怎么不是类似二那样#test__……的呢?当然也注意到他们的xtype不一样,但不懂
另外,是否有办法使得ADOQuery2能访问现象一中的已经创建的#test呢?
[最优解释] 方法1得到的执行方式是:exec sp_executesql N'...', N'@P1 varchar(4)', '0001'
实际上ADOQuery2执行时,已经在不同的session里面了,所以找不到这个对象,方法2完全是同一个session里面的,所以正常,方法2很常规的做法,不觉得有什么问题。
[其他解释] 楼上解释得很清楚了。
但是,不大同意“钻牛角尖”一说,因为弄通一个问题,是一回事,怎么使用又是另一回事,如果大家都不“钻牛角尖”了,写出来的代码都一样,就不存在差异了。事实上,往往是使用的方式方法不同,想的点子不同,效果或会相去甚远。技巧,有时也是“钻”出来的。
[其他解释] 你这种情况不如建一个储存过程。或直接建视图或ADOQUERY中查询语句复杂点就可了,你那样用系统可能不稳定。
[其他解释] 创建视图是一个比较好的解决办法
[其他解释] 为什么要用临时表呢?如果LZ用的是sql server的话,可以在服务器端写自定义函数来创建虚拟表。
[其他解释] 木有人回答,求关注啊!!!
[其他解释] 用全局临时表吧
临时表分是局部的与全局的,局部的临时表只有当前连接有效; 局部的用# (#table)
全局的临时表就是对所有连接有效,即所有用户都能访问; 全局的用2个# (##table)
[其他解释] 引用: 用全局临时表吧 临时表分是局部的与全局的,局部的临时表只有当前连接有效; 局部的用# (#table) 全局的临时表就是对所有连接有效,即所有用户都能访问; 全局的用2个# (##table) 就是想用局部临时表才来问的……因为要考虑多用户同时使用的问题,虽然全局表可以实现不同用户不同表,但太麻烦
[其他解释] 你可以查查MSDN,局部临时表是不行的,不要钻牛角尖了
要不就建一个实实在在的表,或者用相同的连接
[其他解释] 引用: 你可以查查MSDN,局部临时表是不行的,不要钻牛角尖了 要不就建一个实实在在的表,或者用相同的连接 可能是我表述的不太清晰,总结一下吧:
1、用局部临时表:创建方便,也不需要考虑删除,名称冲突等等问题,如果用实体表或全局临时表,因每个用户所对应的数据不同,就必须为每个有需要用户创建名称不同的表(否则,当两个用户同时访问并修改该表时,会发生什么呢?)……
2、Parameters.ParamByName('BillNo').Value:='A00127101'; 用这种方式是为了防止右边的字符串本身带有撇号,会出什么问题,自己试一下就知道了 我觉得这功能还是挺有用的,不是在钻牛角尖[其他解释] 觉得你确实是钻了牛角尖了,规则是死的,人是活的呀,应该在全局临时表的命名上多考虑下,能达到不冲突就OK啦[其他解释] 该回复于2012-09-28 10:44:14被版主删除[其他解释]
引用: 方法1得到的执行方式是:exec sp_executesql N'...', N'@P1 varchar(4)', '0001' 实际上ADOQuery2执行时,已经在不同的session里面了,所以找不到这个对象,方法2完全是同一个session里面的,所以正常,方法2很常规的做法,不觉得有什么问题。 很久前的贴了,不过终于等来了解答……
现象二中提到的办法是没问题的,当时之所以认为有问题,是因为帮人家修Bug,那家伙用的是#39+String+#39这方式而不是QuotedStr(String),虽都是加对撇号,区别却大着呢……
[其他解释] 引用: 但是,不大同意“钻牛角尖”一说,因为弄通一个问题,是一回事,怎么使用又是另一回事,如果大家都不“钻牛角尖”了,写出来的代码都一样,就不存在差异了。事实上,往往是使用的方式方法不同,想的点子不同,效果或会相去甚远。技巧,有时也是“钻”出来的。 当时看到大家在讨论牛角尖,而不是问题的本身,那个气啊……还特别写了上百字反驳之,只是写完了又不想发表了,想着总有明事理的人,就搁置着吧。不过总算没白等……
[其他解释] 引用: 引用:方法1得到的执行方式是:exec sp_executesql N'...', N'@P1 varchar(4)', '0001' 实际上ADOQuery2执行时,已经在不同的session里面了,所以找不到这个对象,方法2完全是同一个session里面的,所以正常,方法2很常规的做法,不觉得有什么问题。 很久前的贴了,不过终于等来…… 这里有本质区别。。。不只是“虽都是加对撇号”