如何使用 OPENJSON 和 where 条件更新和插入 table 中的对象数组
How to Update and Insert Array of Objects in table with OPENJSON and where conditions
我想用 OPENJSON()
更新和插入库存、InvM 和发票 table。我是 SQL 服务器 OPENJSON()
的新手。我有一个对象数组,我想将每个对象插入到 table 的新行中。
我想遍历每个对象并使用 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,
}
]'
如果对象数组中的药品名称与库存table中的药品匹配,如何根据where
条件更新库存table并减少数量(我想出了这个,但它不能正常工作):
UPDATE Stock
SET Qty = Qty - qty
from OPENJSON(@files)
with(qty INT '$.Quantity', Name12 VARCHAR(55) '$.Name')
where Stock.Name = Name12
同样适用于 InvM 和 Invoice table 我想插入具有 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
更新 table。以下示例是您问题的可能解决方案:
示例数据:
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
结果:
Name
Quantity
PENZOL TAB 40 MG
98
Calpax_D Syp 120Ml
99
我想用 OPENJSON()
更新和插入库存、InvM 和发票 table。我是 SQL 服务器 OPENJSON()
的新手。我有一个对象数组,我想将每个对象插入到 table 的新行中。
我想遍历每个对象并使用 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,
}
]'
如果对象数组中的药品名称与库存table中的药品匹配,如何根据where
条件更新库存table并减少数量(我想出了这个,但它不能正常工作):
UPDATE Stock
SET Qty = Qty - qty
from OPENJSON(@files)
with(qty INT '$.Quantity', Name12 VARCHAR(55) '$.Name')
where Stock.Name = Name12
同样适用于 InvM 和 Invoice table 我想插入具有 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
更新 table。以下示例是您问题的可能解决方案:
示例数据:
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
结果:
Name | Quantity |
---|---|
PENZOL TAB 40 MG | 98 |
Calpax_D Syp 120Ml | 99 |