Foxtable(狐表)用户栏目专家坐堂 → [求助]关于SQL语句能否一次提交多行(如一个语块)的提问?


  共有8451人关注过本帖树形打印复制链接

主题:[求助]关于SQL语句能否一次提交多行(如一个语块)的提问?

帅哥哟,离线,有人找我吗?
liguichuan
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:362 积分:3196 威望:0 精华:1 注册:2011/4/20 1:40:00
[求助]关于SQL语句能否一次提交多行(如一个语块)的提问?  发帖心情 Post By:2012/7/4 10:19:00 [显示全部帖子]

假如有两个仓库,仓库1、仓库2;

想将仓库1的物料调拨到仓为2,

那么基础的思想是这样的,仓库1的物料减少,仓库2的物料增加。

那么有可能存在一种情况,当仓库1的物料减少成功时,仓库2的物料增加却因为网络或是其它的问题而导致无法增加相应的量,那么这样后台的数据库就会变得不准确。

 

如果是直接用SQL语句来管理,我们可以引入SQL事务的想法,当仓库1减少成功而仓库2增不成功时就可以进行事务回滚操作。保证数据库的准确性。

但是想用这样的语句来实现,不是单单靠一两条就行的,可能需要写好多行同时提交过去SQL服务器。

 

如下面的语句:

use 信息管理系统  --使用数据库名
GO
begin transaction --开始事务
insert into 调拨明细表(单号,仓库名,物料名,数量,进入库情况) values('201207050002','仓库1','物资A',100,'出库')  --调出

insert into 调拨明细表(单号,仓库名,物料名,数量,进入库情况) values('201207050002','仓库2','物资A',100,'入库')  --调入

DECLARE @x int  --定义变量
DECLARE @y int  --定义变量
DECLARE @z int  --定义变量

--以下为变量运算
set @x = (select COUNT(*) from 调拨明细表 where 单号 = '201207050002' and 仓库名 = '仓库1' and 物料名 ='物资A' and 数量 = 100 and 进入库情况 = '出库')
set @y = (select COUNT(*) from 调拨明细表 where 单号 = '201207050002' and 仓库名 = '仓库2' and 物料名 ='物资A' and 数量 = 100 and 进入库情况 = '入库')
set @z = @x + @y --如果成功,@z变量的值应该为2
--print @x
--print @y
--print @z
if @z <> 2 --如果值不为2时执行回滚操作 
 begin rollback transaction
   print '调拨失败,数据操作不一致!'
 end
else  --值为2时执行正式操作,结束事务
 begin commit transaction
   print '调拨成功!'
 end
go

 

上面的语句操作后验证了调拨的结果,如果只写入一行值,则执行事务回滚操作。

 

我想问的是,FOXTABLE有没有办法在一个语句设置字段里写入多条语句提交,而不是一条一条提交到SQL。我还没有试过能不能分开提交以上语句。

 

当然,您也可能会说:那您不如执行后再查询一下,如果发现数据不一致就删除多余的数据行,当然这也可以,但这样似乎没有办法发挥SQL数据库的强大功能。

其实,目前我也不清楚事务管理只能在SQL查询管理器中执行才有效还是可以用类似FOXTABLE这样的第三方工具提交也有效。

望孤爸给予解答一下,谢谢。

 


 回到顶部