sql-server - 如何使用 OPENJSON 和 where 条件更新和插入表中的对象数组

标签 sql-server sql-update where-clause sql-insert open-json

我想使用 OPENJSON() 更新并插入库存、InvM 和发票表。我是 SQL Server 中 OPENJSON() 的新手。我有一个对象数组,我想将每个对象插入到表的新行中。 我想迭代每个对象并使用 Where 子句和 OPENJSON() 插入或更新它:

对象数组:

DECLARE @f NVARCHAR(MAX) = N'[{
"Batch": "CP008",
"Bonus": -26,
"Code": 002,
"Cost": 50,
"Disc1": 0,
"Name": "Calpax_D Syp 120Ml",
"Price": undefined,
"Quantity": "1",
"SNO": 9,
"STP": 153,
"Stax": 0,
"TP": 50,
"Total": 50,
"invoiceno": 71,
"profit": 156,
"randomnumber": "3MO0FMDLUX0D9P1N7HGV",
"selected": false,
},
{
"Batch": "P009",
"Bonus": 0,
"Code": 823,
"Cost": 237.14999389648438,
"Disc1": 0,
"Name": "PENZOL TAB 40 MG",
"Price": undefined,
"Quantity": "2",
"SNO": 94,
"STP": 263.5,
"Stax": 0,
"TP": 263.5,
"Total": 527,
"invoiceno": 71,
"profit": 156,
"randomnumber": "3MO0FMDLUX0D9P1N7HGV",
"selected": false,
}
]'

如果对象数组中的药品名称与 Stock 表中的药品匹配,如何更新 Stock 表并使用 where 条件减少数量(我想出了这个,但它是无法正常工作):

UPDATE Stock 
SET Qty = Qty - qty  
from OPENJSON(@files) 
with(qty INT '$.Quantity', Name12 VARCHAR(55) '$.Name') 
where Stock.Name = Name12  

InvM 和 Invoice 表也是如此,我想用 where 条件插入新行

insert into InvM (RNDT, Dat, SMID, CID, Total, USR, RefNo, SRID, Txt,InvTime) 
 select RNDT, getdate(), Salesman.SMID, Customer.CID,@total, USR.Name, 0, 
 0,Salesman.Name,CURRENT_TIMESTAMP
 from Salesman, USR,Customer, OPENJSON(@files)  
 with(
    RNDT NVARCHAR(max) '$.randomnumber'
    )
 where USR.Name = 'moiz'



insert into Invoice (SNO, RNDT, Invno, Code, Name, Batch, STP, Qty, Bon, Disc, Stax, NET, 
TP, Cost, Profit)
select SNO, RNDT, InvNo, Code, Name, Batch, STP, Qty, Bon, Disc, Stax, NET, TP, 
Cost,profit  
from OPENJSON(@files) 
with (  
Batch INT '$.Batch',
Bon INT '$.Bouns',
Code INT '$.Code',
Cost INT '$.Cost',
Disc INT '$.Disc1',
Name NVARCHAR(Max) '$.Name',
STP INT '$.STP',
Qty INT '$.Quantity',
SNO INT '$.SNO',
Stax INT '$.Stax',
RNDT NVARCHAR(max) '$.randomnumber',
InvNo INT '$.invoiceno',
TP INT '$.TP',
NET INT '$.Total',
profit INT '$.profit'
)

最佳答案

您需要使用 OPENJSON() 解析输入 JSON并使用适当的 JOIN 更新表。以下示例是您问题的可能解决方案:

示例数据:

SELECT *
INTO Stock
FROM (VALUES
   ('PENZOL TAB 40 MG', 100),
   ('Calpax_D Syp 120Ml', 100)
) v (Name, Quantity)

JSON:

DECLARE @files NVARCHAR(MAX) = N'[
   {
      "Batch":"CP008",
      "Bonus":-26,
      "Code":2,
      "Cost":50,
      "Disc1":0,
      "Name":"Calpax_D Syp 120Ml",
      "Price":"undefined",
      "Quantity":"1",
      "SNO":9,
      "STP":153,
      "Stax":0,
      "TP":50,
      "Total":50,
      "invoiceno":71,
      "profit":156,
      "randomnumber":"3MO0FMDLUX0D9P1N7HGV",
      "selected":false
   },
   {
      "Batch":"P009",
      "Bonus":0,
      "Code":823,
      "Cost":237.14999389648438,
      "Disc1":0,
      "Name":"PENZOL TAB 40 MG",
      "Price":"undefined",
      "Quantity":"2",
      "SNO":94,
      "STP":263.5,
      "Stax":0,
      "TP":263.5,
      "Total":527,
      "invoiceno":71,
      "profit":156,
      "randomnumber":"3MO0FMDLUX0D9P1N7HGV",
      "selected":false
   }
]';

更新声明:

UPDATE s
SET s.Quantity = s.Quantity - j.Quantity
FROM Stock s
JOIN OPENJSON(@files) WITH (
   Name varchar(100) '$.Name', 
   Quantity int '$.Quantity' 
) j ON s.Name = j.Name

结果:

<表类=“s-表”> <标题> 姓名 数量 <正文> PENZOL TAB 40 MG 98 Calpax_D Syp 120毫升 99

关于sql-server - 如何使用 OPENJSON 和 where 条件更新和插入表中的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71923594/

相关文章:

sql - SQL SERVER 中的排序依据和大小写

java - 这个方法有什么作用?

sql-server - SQL Server Management Studio - 查找所有非空表

oracle - ORA-00904 嵌套选择的标识符无效

php - 如何在 mysql 中使用 where 子句选择特定行?

c# - 在同一个存储过程中选择查询和更新查询

mysql - 子查询返回多于1行的解决方案for update query using select statement

sql - 使用 SELECT FOR UPDATE 时出现死锁

使用 Select 或Where 的 C# 谓词不起作用

SQL:有什么方法可以在更新语句中使用 Order By 吗?