临时表的使用稳定吗???

tanxiangfeng 2004-12-21 03:03:46
我写了一个存储过程,把数据到入到临时表,汇总后又插入到正式的表,这样会发生丢记录或没有按预期的进行汇总,并且是在大多数情况是可以的,只有在有时才发生这样的现象,我认真仔细的检查语句很多次,都没有发现语句有问题,我现在怀疑临时表使用不稳定,会出些很奇怪的问题,或许我还对临时表使用不太清楚,请大家赐教一下??
...全文
173 点赞 收藏 19
写回复
19 条回复
chriswu 2004年12月22日
http://community.csdn.net/Expert/topic/3667/3667008.xml?temp=.1682703

问题还没解决,帮帮忙咧~!!
回复 点赞
yingqing 2004年12月22日
zjcxc(邹建)強,學習
回复 点赞
chriswu 2004年12月22日
邹建大哥,怎么锁表啊?
回复 点赞
了缘 2004年12月22日
学习
--------------------------
我是来接分的,要升星!!
回复 点赞
事务不会主动锁表

所以你即使使用了事务,也不能保证存储过程运行过程中,存储过程处理中涉及到的表不被其他程序使用

在你更新 StGoodsCheck4 表前,其他程序是可以对 StGoodsCheck4 表进行操作的
因为取数据时,只能 StGoodsCheck4 表下了共享锁,这时其他程序是可以对 StGoodsCheck4 表进行存取操作的,只有更新的时候,才会使用排它锁

所以虽然你调用存储过程时使用了事务,但也无法保证在数据从 StGoodsCheck4 取到临时表后,对临时表中进行汇总处理的过程中,你的 StGoodsCheck4 表数据没有发生变化

而一旦在更新 StGoodsCheck4 前, StGoodsCheck4 表被其他程序更改了,就有可能出现楼主遇到的情况(当然,如果其他程序没有更新 StGoodsCheck4 表,或者其他程序的处理不影响最终结果,则不会产生数据丢失之类,所以就产生了偶尔数据会出错的情况)
回复 点赞
tanxiangfeng 2004年12月21日
不是,倒腾数据我都对null值进行了处理的,不应该会有问题.
回复 点赞
52juanjuan 2004年12月21日
会不会是SET ANSI_NULLS ON 它的原因呀,临时表是不会有问题的.
回复 点赞
tanxiangfeng 2004年12月21日
我能保证,应为我在程序调用时,是加了事务的,在事务没有执行完,表是锁了的,还有我的存储过程确实也看不出那里有漏洞,怎么就回掉记录呢??
回复 点赞
tanxiangfeng 2004年12月21日
并且只有一个用户在操作
回复 点赞
你的处理过程中没有锁表,你能保证你的存储过程运行过程中,没有其他程序操作存储过程中涉及到的表么?

如果不能保证,那估计情况就是我所说的,你的存储过程运行过程中,其他程序修改了存储过程中涉及到的表,导致数据不一致,从而产生有时不准确的问题(因为你的存储过程运行过程中,其他程序是否操作这些表,本来就是一个不确定的)
回复 点赞
yichuan1982 2004年12月21日
有时候,我都真想直接去商场门口发传单,举牌子了
请一定帮忙,谢谢!
请看看:


http://community.csdn.net/Expert/topic/3663/3663763.xml?temp=.569195
回复 点赞
tanxiangfeng 2004年12月21日
如果有错,那为什么在大多数情况下有不出现这个问题,你们知道吗,我真希望是我写的语句出错,你们看看吧,那里有错??

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO



ALTER PROCEDURE StGoodsCheckOKtidySave
as

set nocount on

if not exists(select * from StGoodsCheck3 where isnull(整理标志,'')<>'是')
raiserror('没有整理的盘点表!!',16,1)

select 盘点表编号 into #TabTemp1 From StGoodsCheck3 where isnull(整理标志,'')<>'是'

SELECT distinct 商品编号, 盘点表编号 into #TabTemp2
FROM StGoodsCheck4
where 盘点表编号 in (select 盘点表编号 from #TabTemp1)


SELECT top 0 成本价, 商品编号, 库存数量, 库存金额, 盘存数量, 盘存金额, 损益数量, 损益金额,
盘点表编号 into #TabTemp3
FROM StGoodsCheck4

insert into #TabTemp3(商品编号,盘存数量,成本价,盘点表编号)
select 商品编号,sum(isnull(盘存数量,0)),成本价,1 from StGoodsCheck4
where 盘点表编号 in (select 盘点表编号 from #TabTemp1)
group by 商品编号,成本价

update #TabTemp3 set 库存数量=B.实际库存,库存金额=B.库存金额 from (
SELECT 商品编号, Sum(isnull(实际库存,0)) as 实际库存
,sum(isnull(实际库存,0)*isnull(结算价,0)) as 库存金额 FROM StWareStocProstk
group by 商品编号) B inner join #TabTemp3 A on A.商品编号=B.商品编号

update #TabTemp3 set 库存数量=0
where isnull(库存数量,0)=0

update #TabTemp3 set 成本价=round(库存金额/库存数量,6)
where isnull(库存数量,0)<>0


update #TabTemp3 set 成本价=B.商品进价
from #TabTemp3 A inner join BaWareFile B on A.商品编号=B.商品编号
where isnull(成本价,0)=0

update #TabTemp3 set 盘存金额=round(isnull(盘存数量,0)*isnull(成本价,0),2),
损益数量=isnull(盘存数量,0)-isnull(库存数量,0)

update #TabTemp3 set 损益金额=isnull(盘存金额,0)-isnull(库存金额,0)


delete from StGoodsCheck4
where 盘点表编号 in (select 盘点表编号 from #TabTemp1)

update #TabTemp3 set 盘点表编号 =A.盘点表编号 from #TabTemp2 A inner join #TabTemp3 B
on A.商品编号=B.商品编号

insert into StGoodsCheck4(成本价, 商品编号, 库存数量, 库存金额, 盘存数量, 盘存金额, 损益数量, 损益金额,
盘点表编号)
select 成本价, 商品编号, 库存数量, 库存金额, 盘存数量, 盘存金额, 损益数量, 损益金额,
盘点表编号 from #TabTemp3

update StGoodsCheck3 set 整理标志='是'
where 盘点表编号 in (select 盘点表编号 from #TabTemp1)


drop table #TabTemp1
drop table #TabTemp2
drop table #TabTemp3




GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

回复 点赞
应该是你的存储过程没有写好,正常不会发生这种情况

另外,也可能是你的数据插入临时表后,有新的数据变化,这样临时表的数据就与实际表中的数据不符
可能这就是你说的汇总的结果不对
回复 点赞
tanxiangfeng 2004年12月21日
LBYYBL(o_o):全局的和局部的有什么样的区别???(比较突出的)
回复 点赞
LBYYBL 2004年12月21日
临时表在关机、重起时消失,如果占用空间不是很多,最好不用临时表
回复 点赞
whw502 2004年12月21日
应该不会把!!
应该是存储过程那一步错了
回复 点赞
tanxiangfeng 2004年12月21日
skyboy0720(人是人他妈生的,妖是妖他妈生的!) : 你使用临时表用得多吗??
回复 点赞
LBYYBL 2004年12月21日
最好用如:##tempname的临时表,为全局临时表
回复 点赞
skyboy0720 2004年12月21日
应该是你存储过程的问题!
回复 点赞
发动态
发帖子
应用实例
创建于2007-09-28

1.1w+

社区成员

6.8w+

社区内容

MS-SQL Server 应用实例
社区公告
暂无公告