Sql同时执行多个update语句并返回每个执行结果?

Sql同时执行多个update语句并返回每个执行结果?,sql,sql-server,Sql,Sql Server,我正在开发一个可以接收全部或部分货物的订单系统 例如,订单包含三项:A、B和C 我将尝试执行扣除库存数量的SQL,如果成功,我将收到该项目。例如: update itemTable set qty = qty-1 where id=A and qty-1>=0 //Success update itemTable set qty = qty-1 where id=B and qty-1>=0 //Failed update itemTable set qty = qty-1 wher

我正在开发一个可以接收全部或部分货物的订单系统

例如,订单包含三项:A、B和C

我将尝试执行扣除库存数量的SQL,如果成功,我将收到该项目。例如:

update itemTable set qty = qty-1 where id=A and qty-1>=0 //Success
update itemTable set qty = qty-1 where id=B and qty-1>=0 //Failed
update itemTable set qty = qty-1 where id=C and qty-1>=0 //Success
然后,订单系统将接受AC并拒绝B

我现在做的是:多次执行sql

我正在逐语句执行它,这需要三个到数据库的连接。伪代码如下所示:

foreach(var item in order.items){
      //Execute sql deducting inventory quantity
     var affectedRows = ExecuteSql("update itemTable set qty = qty-1 where id={item.id} and qty-1>=0")
     if(affectedRows> 0){
        item.Accepted = true;
     }else{
        item.Accepted = false;
    }
}
var sqlStatements = "";
foreach(var item in order.items){
   //Execute sql deducting inventory quantity
   sqlStatements += "update itemTable set qty = qty-1 where id={item.id} and qty-1>=0;"         
}
var result = ExecuteSql(sqlStatements); //Execute once,get all results
foreach(var r in result){
   if(r.successed){
      order.items.find(r.id).Accepted = true;
   }else{
      order.items.find(r.id).Accepted = false;
   }
}
我想要的是:执行一次,返回所有结果

有没有办法一次执行三条语句并返回各自的结果?例如,伪代码如下所示:

foreach(var item in order.items){
      //Execute sql deducting inventory quantity
     var affectedRows = ExecuteSql("update itemTable set qty = qty-1 where id={item.id} and qty-1>=0")
     if(affectedRows> 0){
        item.Accepted = true;
     }else{
        item.Accepted = false;
    }
}
var sqlStatements = "";
foreach(var item in order.items){
   //Execute sql deducting inventory quantity
   sqlStatements += "update itemTable set qty = qty-1 where id={item.id} and qty-1>=0;"         
}
var result = ExecuteSql(sqlStatements); //Execute once,get all results
foreach(var r in result){
   if(r.successed){
      order.items.find(r.id).Accepted = true;
   }else{
      order.items.find(r.id).Accepted = false;
   }
}
或者有更好的方法来实现这个逻辑吗?

使用以下子句:

然后,您可以从@ids-或任何您使用子句的表格中选择ids:


然后,您可以从@ids-或任何需要了解SQL Server版本的表中选择ID。如果是2016+那么基于JSON的方法是可能的。需要知道SQL Server的版本。如果是2016+那么基于JSON的方法是可能的。这就是我想要的,非常感谢!我还有两个问题:1。如果我经常这样做,会不会出现性能问题?2.我必须为并发操作使用不同的表名吗?@IanWong。显然,在服务器上加载会减慢速度,但输出并不会给已经使用更新的负载增加太多。对于第二个问题,table变量是代码块的局部变量,因此您可以在不同的会话中运行相同的代码。这就是我想要的,非常感谢!我还有两个问题:1。如果我经常这样做,会不会出现性能问题?2.我必须为并发操作使用不同的表名吗?@IanWong。显然,在服务器上加载会减慢速度,但输出并不会给已经使用更新的负载增加太多。对于第二个问题,table变量是代码块的本地变量,因此可以在不同的会话中运行相同的代码。