insert时数据丢失,好奇怪

zhegecunzaime 2007-09-24 03:23:49
把A中的数据全部插入到log表中,然后经过对数据的分解再全部插入B表中,这两个过程在一个事务里,没有用游标。现在的问题是B表中数据经常比log表中的数据要少,但我在测试的时候没有这样的问题,出了问题我又测了好几遍还是没问题。大家帮忙想一下有可能是什么原因引起的呢。
...全文
638 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
muziyidan 2008-06-21
  • 打赏
  • 举报
回复
学习学习。
up.............
ruanchao 2007-09-24
  • 打赏
  • 举报
回复
zhegecunzaime 2007-09-24
  • 打赏
  • 举报
回复
那些分解语句不是我写的,是别人写的,我也是看见那个就头疼,谢谢大家了先
brother2605 2007-09-24
  • 打赏
  • 举报
回复
处理过程貌似没有问题,看不出问题在哪。
不过你能不能先把数据导入,然后再UPDATE,在UPDATE过程再进行你的那些转换逻辑。
估计是在转换过程中丢掉数据的。
-布谷鸟- 2007-09-24
  • 打赏
  • 举报
回复
哇噻,你太有才了!!!三层CASE在嵌套!

你这天书SQL,没有时间去详细分析,不过有三点需要改善:
1, 用Substring(Maincd,2,14) 代替RIGHT(LEFT(Maincd,16),14)
2, 使用coalesce代替繁琐的case嵌套
3, 定义字段时别偷懒,字段Maincd和SubCD定义的极不合理
brother2605 2007-09-24
  • 打赏
  • 举报
回复
要是哪位达人能帮忙找出问题所在,分不是问题啊
------------------------------------------------
分确实不是问题,汗~~~
但是累人哦,我看看代码先,那么长~~~~~~~
zhegecunzaime 2007-09-24
  • 打赏
  • 举报
回复
要是哪位达人能帮忙找出问题所在,分不是问题啊
lzuyh 2007-09-24
  • 打赏
  • 举报
回复
学习
晓风残月0110 2007-09-24
  • 打赏
  • 举报
回复
关注~
zhegecunzaime 2007-09-24
  • 打赏
  • 举报
回复
是不是和实际运行中的B表的约束有关,导致某些数据插不入?
————————————————————
但我本地和出错的数据库结构完全相同的阿,问题是在我这边怎么都没问题
Limpire 2007-09-24
  • 打赏
  • 举报
回复
是不是和实际运行中的B表的约束有关,导致某些数据插不入?
zhegecunzaime 2007-09-24
  • 打赏
  • 举报
回复
INSERT INTO T_D_TA_WareHouseIn
(
StockDate
,EntryCD
,VendorCD
,MakerItemCD
,Amount
,MakeDate
,BoxNo
,MakerLotNo
,SubPartsNo
,IndividualNo
,GaugeNo
,PartsCD
,StateFlag
,StateReason
,UpdateCD
,UpdateDate
)
SELECT
CONVERT(SMALLDATETIME,StockDate)AS StockDate
,EntryCD AS EntryCD
,CONVERT(INT,VendorCD)AS VendorCD
,RIGHT(LEFT(Maincd,16),14) AS MakerItemCD
,CONVERT(MONEY,RIGHT(LEFT(Maincd, 26),6))/100 AS Amount
,CASE WHEN ISDATE(RIGHT(LEFT(Maincd, 34),6))=0 THEN GETDATE() ELSE CONVERT(DATETIME,RIGHT(LEFT(Maincd, 34),6),120) END AS MakeDate

,CASE WHEN LEN(CASE WHEN RIGHT(LEFT(Maincd,36),2)='21' THEN RIGHT(RTRIM(Maincd),LEN(Maincd)-36) ELSE '' END)>14 THEN LEFT(CASE WHEN RIGHT(LEFT(Maincd,36),2)='21' THEN RIGHT(RTRIM(Maincd),LEN(Maincd)-36) ELSE '' END,14) ELSE CASE WHEN RIGHT(LEFT(Maincd,36),2)='21' THEN RIGHT(RTRIM(Maincd),LEN(Maincd)-36) ELSE '' END END AS BoxNo

,CASE WHEN LEN(case when left(SubCD,2)='10' then Substring(SubCD ,3,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -2) else case when charindex(' 10',SubCD,1)=0 then null else Substring(SubCD,charindex(' 10',SubCD,1)+3,case when charindex(' ',SubCD,charindex(' 10',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 10',SubCD,1)+1) end -(charindex(' 10',SubCD,1)+3))end end)>20
THEN LEFT(case when left(SubCD,2)='10' then Substring(SubCD ,3,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -2) else case when charindex(' 10',SubCD,1)=0 then null else Substring(SubCD,charindex(' 10',SubCD,1)+3,case when charindex(' ',SubCD,charindex(' 10',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 10',SubCD,1)+1) end -(charindex(' 10',SubCD,1)+3))end end,20)
ELSE case when left(SubCD,2)='10' then Substring(SubCD ,3,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -2) else case when charindex(' 10',SubCD,1)=0 then null else Substring(SubCD,charindex(' 10',SubCD,1)+3,case when charindex(' ',SubCD,charindex(' 10',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 10',SubCD,1)+1) end -(charindex(' 10',SubCD,1)+3))end end
END AS MakerLotNo

,CASE WHEN LEN(case when left(SubCD,4)='7002' then Substring(SubCD ,5,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -4) else case when charindex(' 7002',SubCD,1)=0 then null else Substring(SubCD,charindex(' 7002',SubCD,1)+5,case when charindex(' ',SubCD,charindex(' 7002',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 7002',SubCD,1)+1) end -(charindex(' 7002',SubCD,1)+5))end end)>30
THEN LEFT(case when left(SubCD,4)='7002' then Substring(SubCD ,5,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -4) else case when charindex(' 7002',SubCD,1)=0 then null else Substring(SubCD,charindex(' 7002',SubCD,1)+5,case when charindex(' ',SubCD,charindex(' 7002',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 7002',SubCD,1)+1) end -(charindex(' 7002',SubCD,1)+5))end end,30)
ELSE case when left(SubCD,4)='7002' then Substring(SubCD ,5,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -4) else case when charindex(' 7002',SubCD,1)=0 then null else Substring(SubCD,charindex(' 7002',SubCD,1)+5,case when charindex(' ',SubCD,charindex(' 7002',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 7002',SubCD,1)+1) end -(charindex(' 7002',SubCD,1)+5))end end
END AS SubPartsNo
,case when left(SubCD,3)='251' then Substring(SubCD ,4, 10) else case when charindex(' 251',SubCD,1)=0 then '0000000000' else Substring(SubCD,charindex(' 251',SubCD,1)+4,10) end end AS IndividualNo

,CASE WHEN LEN(case when left(SubCD,3)='240' then Substring(SubCD ,4,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -3) else case when charindex(' 240',SubCD,1)=0 then null else Substring(SubCD,charindex(' 240',SubCD,1)+4,case when charindex(' ',SubCD,charindex(' 240',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 240',SubCD,1)+1) end -(charindex(' 240',SubCD,1)+4))end end) > 30
THEN LEFT(case when left(SubCD,3)='240' then Substring(SubCD ,4,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -3) else case when charindex(' 240',SubCD,1)=0 then null else Substring(SubCD,charindex(' 240',SubCD,1)+4,case when charindex(' ',SubCD,charindex(' 240',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 240',SubCD,1)+1) end -(charindex(' 240',SubCD,1)+4))end end,30)
ELSE case when left(SubCD,3)='240' then Substring(SubCD ,4,case when CHARINDEX(' ',SubCD,1)=0 then len(SubCD) else CHARINDEX(' ',SubCD,1) end -3) else case when charindex(' 240',SubCD,1)=0 then null else Substring(SubCD,charindex(' 240',SubCD,1)+4,case when charindex(' ',SubCD,charindex(' 240',SubCD,1)+1)=0 then len(SubCD)+1 else charindex(' ',SubCD,charindex(' 240',SubCD,1)+1) end -(charindex(' 240',SubCD,1)+4))end end
END AS GaugeNo
,PartsCD AS PartsCD
,0 AS StateFlag
,'' AS StateReason
,CONVERT(decimal,@UpdateCD) AS UpdateCD
,GETDATE()AS UpdateDate
FROM T_W_TA_WareHouseIn
看起来很麻烦
giftzheng 2007-09-24
  • 打赏
  • 举报
回复
对比一下你的数据看下少了哪些数据

看下这些数据有什么特点就知道了
brother2605 2007-09-24
  • 打赏
  • 举报
回复
把你的处理过程贴出来,看看是否存在问题。
zhegecunzaime 2007-09-24
  • 打赏
  • 举报
回复
我想应该不是逻辑的问题,因为那些有问题的数据我都取到本地又测了一遍,但在本地很正常,试了好几遍都是,和log表里的数据一致
Limpire 2007-09-24
  • 打赏
  • 举报
回复
不了解分解过程如何,个人认为很可能分解时 NULL 值的问题。
===============================
就是把一个条形码分解出来,的确有些字段是空的,为什么空的会出问题呢

--------------------------
那就用几条NULL值得记录分解试试,看看是不是这个问题,是这个问题再深入分解逻辑,不是就没必要了。
zhegecunzaime 2007-09-24
  • 打赏
  • 举报
回复
分解过程上有没有用到
Set ANSI_NULLS ---ON/OFF
——————————————————————————
没有,在往A表插数据的时候会产生大量的awaiting command,有影像么
SoftwKLC 2007-09-24
  • 打赏
  • 举报
回复
分解过程上有没有用到
Set ANSI_NULLS ---ON/OFF
zhegecunzaime 2007-09-24
  • 打赏
  • 举报
回复
log表还没清空就insert了吧
==============
清空的是A表不是log表,初的错误都是B表中数据比log表少,重复数据有些B表只插入了一条,有些都插进去了,另外有些数据只在log表中有B中没有,但这样的很少
zhegecunzaime 2007-09-24
  • 打赏
  • 举报
回复
不了解分解过程如何,个人认为很可能分解时 NULL 值的问题。
===============================
就是把一个条形码分解出来,的确有些字段是空的,为什么空的会出问题呢
加载更多回复(7)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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