十万火急!心急如焚!关于存储过程的问题,请高手们救命!

liangcq 2013-01-22 09:25:10
问题如下面蓝色字体所述:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pro_Mate_Out_CheckNo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[pro_Mate_Out_CheckNo]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

/*---------------------------------------------------------------------
过程名称:原料出库【反审】
修改内容:
-----------------------------------------------------------------------*/
CREATE PROCEDURE pro_Mate_Out_CheckNo @UserName nvarchar(50)
WITH ENCRYPTION AS
SET XACT_ABORT ON
Begin Transaction

--00 读取参数
Declare @ProcName nvarchar(50)
Declare @BillCode nvarchar(50)

Select @ProcName = 'pro_Mate_Out_CheckNo'

Select @BillCode = FValue
From Base_Procedure
Where FItem = '单号'
And FUserName = @UserName
And FProcName = @ProcName

Declare @Count int --计数器
Declare @Type nvarchar(50) --单据类型
Declare @State nvarchar(50) --单据状态

Select @Type = FType,
@State = FState
From Mate_OutHead
Where FCode = @BillCode

--01 检查数据的完整性和有效性

--0101 单据状态检查
If IsNull(@State,'') <> '审核'
Begin
Rollback
RaisError('操作无效!只有审核的单据才能反审。', 11, 1)
Return
End

--0102 表体物料不能为空
Select @Count = Count(*)
From Mate_OutBody
Where FHead = @BillCode
And IsNull(FMaterialCode,'') = ''

If @Count > 0
Begin
Rollback
RaisError('物料编号有为空的记录,不能反审!', 11, 1)
Return
End

--0103 表体仓位不能为空
Select @Count = Count(*)
From Mate_OutBody
Where FHead = @BillCode
And IsNull(FPlaceName,'') = ''

If @Count > 0
Begin
Rollback
RaisError('仓位有为空的记录,不能反审!', 11, 1)
Return
End

--02 更新库存数据

--0201 增加物料表的数量和金额
Update Mate_Material
Set FAmount = IsNull(FAmount,0) + F1,
FMoney = IsNull(FMoney,0) + F2
From (Select FMaterialCode, Sum(IsNull(FAmount,0)) As F1, Sum(IsNull(FMoney,0)) As F2
From Mate_OutBody
Where FHead = @BillCode
Group By FMaterialCode) As T1
Where FCode = FMaterialCode

--03 更新库存关系表

--0301 插入库存关系表的缺少记录
Insert Into Mate_Relation(FMaterialCode, FPlaceName)
Select Distinct FMaterialCode, FPlaceName
From Mate_OutBody
Where FHead = @BillCode
And (FMaterialCode + FPlaceName) Not In
(Select IsNull(FMaterialCode,'') + IsNull(FPlaceName,'') From Mate_Relation)

--0302 增加库存关系表的数量
Update Mate_Relation
Set FAmount = IsNull(FAmount,0) + F1
From (Select FMaterialCode, FPlaceName, Sum(IsNull(FAmount,0)) As F1
From Mate_OutBody
Where FHead = @BillCode
Group By FMaterialCode, FPlaceName) As T1
Where Mate_Relation.FMaterialCode = T1.FMaterialCode
And Mate_Relation.FPlaceName = T1.FPlaceName


--上面红色部分偶尔没有执行,但下面的状态更新却执行了。结果导致单据反审了,但库存数量却没有增加。
--这种现象并不常出现,单独测试这个存储过程的时候不出问题,不知道为什么?请帮我看一下,多谢!
--我用的是SQLServer2000,已打SP4补丁了。
--如果需要相应的数据库和程序,我可以打包发给你。


--04 更新物料表
Execute pro_Insert_Proc @UserName, 'pro_Mate_Update', '单号', ''
Execute pro_Insert_Proc @UserName, 'pro_Mate_Update', '类型', '物料档案'
Execute pro_Mate_Update @UserName

--05 更新状态
Update Mate_OutHead
Set FState = '提交',
FCheckName = Null,
FCheckDate = Null
Where FCode = @BillCode


Commit

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
...全文
414 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangcq 2013-01-24
  • 打赏
  • 举报
回复
我顶!
liangcq 2013-01-23
  • 打赏
  • 举报
回复
我顶
liangcq 2013-01-23
  • 打赏
  • 举报
回复
老兄做什么工作,这么晚了还在加班? 执行速度目前倒是不慢,挺顺畅的。 如果SQL语句从写法上没有问题,我想从【事务处理】和【更新锁】两个方面入手解决。 我把代码改动如下,你看行吗? 蓝色字体是我添加的部分: --02 更新库存数据 --0201 增加物料表的数量和金额 Update Mate_Material With (UPDLOCK) Set FAmount = IsNull(FAmount,0) + F1, FMoney = IsNull(FMoney,0) + F2 From (Select FMaterialCode, Sum(IsNull(FAmount,0)) As F1, Sum(IsNull(FMoney,0)) As F2 From Mate_OutBody Where FHead = @BillCode Group By FMaterialCode) As T1 Where FCode = FMaterialCode --03 更新库存关系表 --0301 插入库存关系表的缺少记录 Insert Into Mate_Relation With (UPDLOCK)(FMaterialCode, FPlaceName) Select Distinct FMaterialCode, FPlaceName From Mate_OutBody Where FHead = @BillCode And (FMaterialCode + FPlaceName) Not In (Select IsNull(FMaterialCode,'') + IsNull(FPlaceName,'') From Mate_Relation) --0302 增加库存关系表的数量 Update Mate_Relation With (UPDLOCK) Set FAmount = IsNull(FAmount,0) + F1 From (Select FMaterialCode, FPlaceName, Sum(IsNull(FAmount,0)) As F1 From Mate_OutBody Where FHead = @BillCode Group By FMaterialCode, FPlaceName) As T1 Where Mate_Relation.FMaterialCode = T1.FMaterialCode And Mate_Relation.FPlaceName = T1.FPlaceName
ljr_aa 2013-01-23
  • 打赏
  • 举报
回复
把检测数据写在另一个存储过程或程序中,更新数据独立出来。
liangcq 2013-01-23
  • 打赏
  • 举报
回复
我再顶!
Andy-W 2013-01-23
  • 打赏
  • 举报
回复
我個人覺得這問題應該從數據上去查,語句沒什麽就是數據的問題了。 你可以做個日誌表跟蹤下更新庫存的過程. e.g. --0201 增加物料表的数量和金额 Update Mate_Material Set FAmount = IsNull(FAmount,0) + F1, FMoney = IsNull(FMoney,0) + F2 From (Select FMaterialCode, Sum(IsNull(FAmount,0)) As F1, Sum(IsNull(FMoney,0)) As F2 From Mate_OutBody Where FHead = @BillCode Group By FMaterialCode) As T1 Where FCode = FMaterialCode if @@rowcount =0 --写日志 begin insert into db_log .... end 不写日志也可以,使用rollback 方法并告诉客户端,找不到对应的库存数据无法更新库存,也说明这原料在仓库有问题。
liangcq 2013-01-23
  • 打赏
  • 举报
回复
顶起来!
發糞塗牆 2013-01-22
  • 打赏
  • 举报
回复
对于9楼,如果你觉得比较大的可能行,那么你可以尝试加锁,但是应该有规律检查一下是否会更慢或者有死锁。 对于10楼,业务我不熟,写法上我帮不了你,但是如果觉得慢,可以把执行计划贴出来看看 刚才加班去了。现在才搞完
liangcq 2013-01-22
  • 打赏
  • 举报
回复
我要实现的功能其实很简单:当领料出库单反审后,相应物料的库存数量增加。 物料库存表为:Mate_Material(FCode, FAmount) 出库单表体为:Mate_OutBody(FMaterial, FAmount) 对应的更新语句如下: Update Mate_Material Set FAmount = IsNull(FAmount,0) + F1, FMoney = IsNull(FMoney,0) + F2 From (Select FMaterialCode, Sum(IsNull(FAmount,0)) As F1, Sum(IsNull(FMoney,0)) As F2 From Mate_OutBody Where FHead = @BillCode Group By FMaterialCode) As T1 Where FCode = FMaterialCode 有没有别的写法呢?
liangcq 2013-01-22
  • 打赏
  • 举报
回复
你说的也有道理,我的推测是: 1、因事务产生冲突,导致Update语句是执行了,但没有影响任何记录。 2、Where条件不符合,导致Update语句是执行了,但没有影响任何记录。 第一种的可能性比较大,但无法再现。 第二种情况不大,因为后面有个更新单据状态的Update语句,它一直是更新成功的。 郁闷…… 高人,有没有别的思路呢?
發糞塗牆 2013-01-22
  • 打赏
  • 举报
回复
中间那块没有执行我个人觉得: 1、你的@count每次用完没有重置,影响了,试试每次使用钱先set @count=0。 2、那段红字部分的条件不符合,导致执行了,但是没结果,所以你看到是没执行。
liangcq 2013-01-22
  • 打赏
  • 举报
回复
我的程序里已经设置了事务了,如下: SET XACT_ABORT ON Begin Transaction 我的代码块1 我又调用了另一存储过程(里面也含有事务处理) 我的代码块2 Commit 这样做有问题吗?
liangcq 2013-01-22
  • 打赏
  • 举报
回复
我顶!
發糞塗牆 2013-01-22
  • 打赏
  • 举报
回复
加锁是一种方式,但是如果你的update不够快,会造成阻塞甚至死锁。你把这套逻辑处理放在 begin tran 代码块 commit/rollback 中。
liangcq 2013-01-22
  • 打赏
  • 举报
回复
如果加上更新锁,是否可行,如下: Update Mate_Material With (UPDLOCK) Set FAmount = IsNull(FAmount,0) + F1, FMoney = IsNull(FMoney,0) + F2 From (Select FMaterialCode, Sum(IsNull(FAmount,0)) As F1, Sum(IsNull(FMoney,0)) As F2 From Mate_OutBody Where FHead = @BillCode Group By FMaterialCode) As T1 Where FCode = FMaterialCode 请高人指点一下!
liangcq 2013-01-22
  • 打赏
  • 举报
回复
放到一个事务里面来保证业务的一致性。这才是最重要的。 这句话怎么理解? 是指不要在存储过程中调用其它含事务处理的存储过程吗?
發糞塗牆 2013-01-22
  • 打赏
  • 举报
回复
放到一个事务里面来保证业务的一致性。这才是最重要的。
叶子 2013-01-22
  • 打赏
  • 举报
回复
这种偶尔发生的情况很难查找原因.
【采用BPSK或GMSK的Turbo码】MSK、GMSK调制二比特差分解调、turbo+BPSK、turbo+GMSK研究(Matlab代码实现)【采用BPSK或GMSK的Turbo码】MSK、GMS内容概要:本文主要介绍了采用BPSK或GMSK调制方式的Turbo码相关技术研究,重点涵盖GMSK调制下的二比特差分解调方法、Turbo码与BPSK/GMSK调制相结合的系统性能分析,并提供了完整的Matlab代码实现方案。研究内容包括调制解调原理、编码结构设计、误码率仿真及系统优化等关键环节,旨在通过仿真手段验证所提出方案的有效性和可靠性,帮助研究人员深入理解现代数字通信系统中的关键技术和其实现方法。; 适合人群:具备一定通信原理和Matlab编程基础,从事无线通信、信号处理、编码理论等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握GMSK调制与Turbo码结合的系统设计与仿真方法;②学习二比特差分解调算法在实际通信系统中的应用;③通过Matlab代码实现提升对数字调制解调和信道编码技术的理解与实践能力;④为相关课题研究、毕业设计或工程项目提供参考和技术支持。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块运行与调试,对照通信系统基本原理深入理解各环节功能,重点关注调制解调过程与Turbo译码的协同工作机制,并尝试修改参数以观察系统性能变化,从而达到理论与实践相结合的学习效果。
代码转载自:https://pan.quark.cn/s/a4b39357ea24 LA 1010 逻辑分析仪被视作一种效能卓越的数字信号分析设备,其核心功能在于对数字通信协议,例如I²C,进行检测与解构。本资源将集中阐述LA 1010的操作流程以及如何借助该设备对I²C协议的波形展开分析。 确保逻辑分析仪被正确地连接至目标系统是极为关键的环节。在运用LA 1010的过程中,必须将分析仪的通道0与通道1分别对应连接至目标装置的SCL(时钟)与SDA(数据)线路。务必保证连接的稳固性且无任何干扰因素,以此确保数据采集的精确度。 随后,需要设定采样参数。采样频率对于能否成功捕捉到信号具有决定性的作用。针对I²C协议,通常选用的采样频率范围介于100kHz到400kHz之间,这一范围的选择取决于实际应用场景中I²C总线的运行速度。然而,LA 1010所能达到的最高采样速率可能高达500MHz,因此需要根据具体需求进行相应的调整。此外,还必须精心挑选适配目标设备工作电压的电压等级,例如3.3V、5V或1.8V。 在软件操作层面,需要选取恰当的通道与协议种类,即I²C。一旦启动采样,逻辑分析仪便开始记录相关数据。软件界面通常会实时展示波形图,为观察与分析提供便利。 关于I²C协议波形的解读,我们可以遵循以下步骤: 1. 总线处于空闲状态时:SCL与SDA均维持在高电平位置,这表明总线当前未进行数据传输。 2. 传输起始信号:当SCL处于高电平期间,SDA线从高电平转换至低电平,此动作标志着数据传输的开始。 3. 地址、数据及应答的识别:在每一个SCL高电平脉冲的持续时间内,SDA线上的电平状态代表了数据位。地址与数据的传输均为双向过程,而读写标识则由SDA线上的电平来...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 在当前文档中,我们将详细研究在C#开发平台中借助BouncyCastle.Crypto库1.8.10版本达成中国的国家标准密码学方案,涵盖SM2、SM3以及SM4这几项技术。这些密码学方案在中国网络安全保障与数据维护领域具有核心地位,为本地化安全解决方案提供了坚实的技术支撑。 让我们首先掌握这三个国家密码算法的基本原理: 1. **SM2算法**:SM2是一种基于椭圆曲线密码体系(ECC)的公钥加密方案,主要用于数字签名和加密操作。它提供了一种高效且安全的身份确认和数据防护机制。 2. **SM3算法**:SM3是一种密码学哈希函数,与SHA-256类似,能够将任意长度的输入信息压缩为固定长度的摘要,常用于数据完整性的检验和确认。 3. **SM4算法**:SM4是一种分组密码方案,采用128位的分组大小和128位的密钥,适用于对称加密,广泛用于无线网络传输和存储数据的加密处理。 接下来,我们将逐步解析如何运用BouncyCastle.Crypto库在C#环境下实现这些密码学方案: **1. 引入库与配置开发环境** 在C#应用程序中,需要通过NuGet包管理工具或手动方式添加BouncyCastle库的引用。务必确保安装的是1.8.10版本。 ```csharp using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; ``` **2. 实施SM2的加签与解签** SM2的签名过程和验证操作涉及椭圆曲线运算。必须创建一个私...

22,296

社区成员

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

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