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