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

tanxiangfeng 2004-12-21 03:03:46
我写了一个存储过程,把数据到入到临时表,汇总后又插入到正式的表,这样会发生丢记录或没有按预期的进行汇总,并且是在大多数情况是可以的,只有在有时才发生这样的现象,我认真仔细的检查语句很多次,都没有发现语句有问题,我现在怀疑临时表使用不稳定,会出些很奇怪的问题,或许我还对临时表使用不太清楚,请大家赐教一下??
...全文
215 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
学习
--------------------------
我是来接分的,要升星!!
zjcxc 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
  • 打赏
  • 举报
回复
我能保证,应为我在程序调用时,是加了事务的,在事务没有执行完,表是锁了的,还有我的存储过程确实也看不出那里有漏洞,怎么就回掉记录呢??
zjcxc 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

zjcxc 2004-12-21
  • 打赏
  • 举报
回复
应该是你的存储过程没有写好,正常不会发生这种情况

另外,也可能是你的数据插入临时表后,有新的数据变化,这样临时表的数据就与实际表中的数据不符
可能这就是你说的汇总的结果不对
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
  • 打赏
  • 举报
回复
应该是你存储过程的问题!

27,579

社区成员

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

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