以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]关于SQL语句能否一次提交多行(如一个语块)的提问?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=21171)

--  作者:liguichuan
--  发布时间:2012/7/4 10:19:00
--  [求助]关于SQL语句能否一次提交多行(如一个语块)的提问?

假如有两个仓库,仓库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这样的第三方工具提交也有效。

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

 


--  作者:狐狸爸爸
--  发布时间:2012/7/4 11:26:00
--  
你可以做个存储过程,通过foxtable来调用