`

SQL存储过程事务--主从表同时插入以及一般性事务处理

SQL 
阅读更多

ALTER Proc AddPurcaseInStoreRoom
@PurcaseInStoreRoomNo Char(30),
@InDate SmallDatetime,
@ProviderID Int,
@ArrivePurchaseInspectID Int,
@ArrivePurchaseInspectNo Char(30),
@Remark Varchar(100),
@TotalAmount Money,
@InputEmployeeID Int,
@AddDetailSql Varchar(500)
As
Declare @newId int, @State int, @tmpPid int, @tmpSid int, @tmpPrice money, @Pno Varchar(30), @Count int, @tmpstr Varchar(500)
Set @State = 0

Begin Tran
--插入主表
Insert Into tPurcaseInStoreRoom (PurcaseInStoreRoomNo, InDate, ProviderID, ArrivePurchaseInspectID, ArrivePurchaseInspectNo, Remark, IsSettled, TotalAmount, SettledAmount, RealPayAmount, InputEmployeeID, InputDateTime)
Values (@PurcaseInStoreRoomNo, @InDate, @ProviderID, @ArrivePurchaseInspectID, @ArrivePurchaseInspectNo, @Remark, 0, @TotalAmount, 0, 0, @InputEmployeeID, GetDate())

If @@Error <> 0
Begin
Rollback Tran
Return -1
End
Set @newId = @@Identity

--插入从表
Set @tmpstr = Convert(Varchar, @newId)
Set @tmpstr = Replace(@AddDetailSql, '-Id', @tmpstr)
Exec(@tmpstr)

If @@Error <> 0
Begin
Rollback Tran
Return -1
End

--更新商品最新进价以及库存状态
Declare Temp_Cursor Cursor
For
Select ProductID, StoreRoomID, Price, BatchNo, Amount From tPurcaseInStoreRoomDetail Where PurcaseInStoreRoomID = @newId

Open Temp_Cursor
--如果没有任何行则直接退出
If @@Cursor_Rows = 0
Begin
Close Temp_Cursor
Deallocate Temp_Cursor
End

While @State = 0
Begin
Fetch Temp_Cursor Into @tmpPid, @tmpSid, @tmpPrice, @Pno, @Count
Select @State = @@Fetch_Status

--修改最近进价
Update tProduct Set RecCostPrice = @tmpPrice Where ProductID = @tmpPid And RecCostPrice != @tmpPrice

--修改库存信息
--
如果该批号商品存在于数据库中则更新
if (Exists(Select StoreRoomID From tStock Where ProductID = @tmpPid And BatchNo = @Pno))
Update tStock Set Amount = Amount + @Count Where ProductID = @tmpPid And BatchNo = @Pno
else
Insert Into tStock (StoreRoomID, ProductID, BatchNo, ProviderID, [ExpireDate], Amount, CostPrice, IsStopSale)
Values (@tmpSid, @tmpPid, @Pno, @ProviderID, GetDate(), @Count, @tmpPrice, 0)

If @@Error <> 0
Begin
Rollback Tran
Close Temp_Cursor
Deallocate Temp_Cursor
Return -1
End
End

Close Temp_Cursor
Deallocate Temp_Cursor

--修改导入状态
Update tArrivePurchaseInspect Set IsCite = 1 Where ArrivePurchaseInspectID = @ArrivePurchaseInspectID

If @@Error <> 0
Begin
Rollback Tran
Return -1
End
Commit Tran
Return @newId

分享到:
评论

相关推荐

    sqlserver中操作主从关系表的sql语句

    典型的方法就是对于主表的各数据字段进行更新或新增,对于从表一般都会先删除相关的所有记录,然后再进行插入。也就是说每次保存时,从表的数据都要重新执行一遍删除再插入的过程。这是一个不错的方法,在使用数据库...

    mysql备份innodb类型的表或数据库

    1. **InnoDB存储引擎**:是MySQL中最常用的存储引擎之一,支持事务处理、行级锁定以及外键约束等特性。 2. **mysqldump工具**:MySQL自带的一个用于备份数据库的命令行工具,可以导出整个数据库或指定表的数据到SQL...

    MYSQL中文帮助文档

    - **存储引擎**:MySQL支持多种存储引擎,如InnoDB(事务安全,支持行级锁定),MyISAM(非事务安全,快速读取),Memory(数据存储在内存中)等,选择合适的存储引擎对性能有很大影响。 3. **SQL基础**: - **...

    MySQL DBA高频面试题

    - 关系型数据库(如MySQL)使用表结构存储数据,强调事务、一致性和查询语言的灵活性。 - 非关系型数据库(如MongoDB)采用键值对等更灵活的数据模型,适合快速迭代开发和非结构化数据存储。 12. 数据库范式: -...

    MySQL数据库学习.zip

    由于文件名没有提供具体信息,上述内容是对MySQL数据库学习的一般性概述。实际文件可能侧重于这些话题中的某一部分或提供更深入的实践指导。学习MySQL需要理论与实践相结合,通过实例操作来加深理解,希望这个资源能...

    Oracle与MySQL DBA面试大全

    - **存储过程和性能提升**:利用存储过程可以在数据库层面封装逻辑,提高数据处理效率。 - **Oracle文件类型**:了解Oracle数据库文件的种类,包括数据文件、控制文件、日志文件、参数文件、归档日志文件等,并掌握...

    深入理解MySql.pdf

    由于没有实际的文本内容可以分析,以上提供的知识点是基于您提供的文件标题和描述,以及对MySQL数据库的一般性理解。希望这可以作为您深入理解MySQL的起点。如果您有实际的书籍内容需要分析,请提供详细内容,我将...

    linux centos MySql备份和恢复方案.7z

    - `mysqldump`:常用工具,可以生成SQL脚本,包含创建数据库、表以及插入数据的语句,用于全量备份。 - `binlog`:利用MySQL的二进制日志,进行增量备份,记录所有改变数据库的事务。 - `Percona Xtrabackup`:一...

    ADO.NET结构

    本文将详细介绍ADO.NET的结构,包括其主要组成部分:命名空间、类、对象,以及异常处理和事务管理。 #### 二、命名空间 ADO.NET的核心组件分布在几个关键的命名空间中,这些命名空间提供了各种功能以支持数据访问...

    MYSQL5.7官方文档-5.7

    MySQL 5.7是MySQL数据库管理系统的一个重要版本,它提供了许多增强的功能和改进,旨在提高性能、可扩展性以及安全性。本参考手册详细记录了MySQL 5.7从5.7.0到5.7.28的所有版本,同时也涵盖了基于NDB 7.5的NDB ...

    计算机数据库系统及应用(SQL)附带考试答案 本文链接:https://blog.csdn.net/Candy5204/arti

    以上内容覆盖了计算机数据库系统及应用(SQL)中的多个重要知识点,包括主从式结构的特点、完整性约束机制、并发控制、数据库的故障类型、访问控制机制等多个方面,旨在帮助读者全面理解数据库系统的运作原理及其在...

    MySQL学习的一些记录.zip

    12. **复制与集群**:MySQL的主从复制用于实现高可用性和数据冗余,而MySQL Cluster提供分布式事务处理和故障恢复。 13. **分区与分片**:大表的分区可以提高查询性能,而分片则用于水平扩展数据库能力。 14. **...

    mysql-5.5.27-win32.zip

    MySQL支持SQL标准,提供事务处理、备份、恢复、安全性和可扩展性等功能,广泛应用于网站开发、数据仓库、嵌入式系统等领域。 在压缩包内,我们找到了“mysql-5.5.27-win32.msi”文件,这是Windows Installer ...

    ORACLEFORM培训资料.docx

    - 事务管理确保数据的一致性和完整性。 - Forms 支持事务提交和回滚操作,确保每次数据更改都能正确执行。 #### Form设计工具 - **Form界面设计** - Forms 提供了丰富的工具集来创建美观且实用的用户界面。 - ...

    MySQL开发者入门+进阶学习资源合集.zip

    3. SQL语言基础:掌握SQL(Structured Query Language)的基础语法,包括创建、修改和删除数据库、表的语句(CREATE、ALTER、DROP),以及插入、更新、删除数据的语句(INSERT、UPDATE、DELETE)。 4. 查询操作:...

    mysql-installer-community-8.0.25.0.rar

    3. **InnoDB引擎改进**:包括更快的插入速度、更高的并发性能和更好的内存管理,使得InnoDB引擎处理大数据量时更为高效。 4. **JSON增强**:支持JSON字段的索引和查询优化,增强了NoSQL与SQL的融合能力。 5. **表...

    mysql topic 学习.zip

    4. **事务处理**:了解事务的ACID属性(原子性、一致性、隔离性和持久性),以及如何使用COMMIT、ROLLBACK和SAVEPOINT来管理事务。 5. **索引与性能优化**:索引可以显著提高查询速度。学习如何创建和管理不同类型...

    mysql5.6.25-win64.msi

    为了充分利用 MySQL 5.6.25,你需要了解 SQL 基础,包括 DDL(Data Definition Language)用于创建和修改表结构,DML(Data Manipulation Language)用于插入、更新和删除数据,以及 DCL(Data Control Language)...

    数据库原理与设计

    视图是基于一个或多个表的虚拟表,它可以简化复杂的查询,同时也增加了数据的安全性。 **3.6 数据控制** 数据控制包括授权和撤销权限等功能,用于管理数据库的访问权限。 #### 四、关系数据库设计理论 **4.1 ...

    mysql-8.0.26-macos11-x86_64.dmg.zip

    2. **InnoDB存储引擎的改进**:InnoDB作为MySQL的主要事务处理引擎,8.0.26版本对其进行了优化,包括更快的索引插入、更好的并发处理和更高效的锁定机制。 3. **窗口函数**:MySQL 8.0引入了SQL标准的窗口函数,...

Global site tag (gtag.js) - Google Analytics