我想使用 nodejs mssql 包通過以下 json 批量插入資料:
[
{
"name": "Tom",
"registerDate": "2021-10-10 00:00:00",
"gender": 0,
"consumeRecord":[
{
"date": "2021-10-11 00:00:00",
"price": 102.5
},
{
"date": "2021-10-12 00:00:00",
"price": 200
}
]
},
{
"name": "Mary",
"registerDate": "2021-06-10 00:00:00",
"gender": 1,
"consumeRecord":[
{
"date": "2021-07-11 00:00:00",
"price": 702.5
},
{
"date": "2021-12-12 00:00:00",
"price": 98.2
}
]
}
]
我正在嘗試為具有多個消費資料的成員記錄進行 mssql 批量插入?
有什么東西可以像下面這樣批量插入一對多。因為它似乎需要先插入成員表并獲取id(主鍵)。然后將 id(主鍵)用于消費表關系資料
const sql = require('mssql')
// member table
const membertable = new sql.Table('Member')
table.columns.add('name', sql.Int, {nullable: false})
table.columns.add('registerDate', sql.VarChar(50), {nullable: false})
table.columns.add('gender', sql.VarChar(50), {nullable: false})
// consume record table
const consumeTable = new sql.Table('ConsumeRecord')
table.columns.add('MemberId', sql.Int, {nullable: false})
table.columns.add('Date', sql.VarChar(50), {nullable: false})
table.columns.add('price', sql.Money, {nullable: false})
// insert into member table
jsonList.forEach(data => {
table.rows.add(data.name)
table.rows.add(data.registerDate)
table.rows.add(data.gender)
consumeTable.rows.add(data.memberId) // <---- should insert member table id
consumeTable.rows.add(data.consumeRecord.data)
consumeTable.rows.add(data.consumeRecord.price)
const request = new sql.Request()
request.bulk(consumeTable , (err, result) => {
})
})
const request = new sql.Request()
request.bulk(membertable , (err, result) => {
})
預期記錄:成員表
| id(自動遞增) | 姓名 | 注冊日期 | 性別 |
|---|---|---|---|
| 1 | 湯姆 | 2021-10-10 00:00:00 | 0 |
| 2 | 瑪麗 | 2021-06-10 00:00:00 | 1 |
消費記錄表
| ID | 會員ID | 日期 | 價錢 |
|---|---|---|---|
| 1 | 1 | 2021-10-10 00:00:00 | 102.5 |
| 2 | 1 | 2021-10-12 00:00:00 | 200 |
| 3 | 2 | 2021-07-11 00:00:00 | 702.5 |
| 4 | 2 | 2021-12-12 00:00:00 | 98.2 |
uj5u.com熱心網友回復:
最好的方法是將整個內容批量上傳到 SQL Server,并確保它插入正確的外鍵。
你有兩個選擇
選項1
- 將主表作為表值引數或 JSON blob 上傳
- Insert with
OUTPUT子句將插入的 ID 選擇回客戶端 - 將這些 ID 關聯回子表資料
- 也批量插入
選項 2 更簡單一點:用 SQL 完成整個事情
- 將所有內容上傳為一個大的 JSON blob
- 將帶
OUTPUT子句的主表插入表變數 - 插入子表,加入表變數中的 ID
CREATE TABLE Member(
Id int IDENTITY PRIMARY KEY,
name varchar(50),
registerDate datetime NOT NULL,
gender tinyint NOT NULL
);
CREATE TABLE ConsumeRecord(
MemberId Int NOT NULL REFERENCES Member (Id),
Date datetime not null,
price decimal(9,2)
);
注意列的更合理的資料型別
DECLARE @ids TABLE (jsonIndex nvarchar(5) COLLATE Latin1_General_BIN2 not null, memberId int not null);
WITH Source AS (
SELECT
j1.[key],
j2.*
FROM OPENJSON(@json) j1
CROSS APPLY OPENJSON(j1.value)
WITH (
name varchar(50),
registerDate datetime,
gender tinyint
) j2
)
MERGE Member m
USING Source s
ON 1=0 -- never match
WHEN NOT MATCHED THEN
INSERT (name, registerDate, gender)
VALUES (s.name, s.registerDate, s.gender)
OUTPUT s.[key], inserted.ID
INTO @ids(jsonIndex, memberId);
INSERT ConsumeRecord (MemberId, Date, price)
SELECT
i.memberId,
j2.date,
j2.price
FROM OPENJSON(@json) j1
CROSS APPLY OPENJSON(j1.value, '$.consumeRecord')
WITH (
date datetime,
price decimal(9,2)
) j2
JOIN @ids i ON i.jsonIndex = j1.[key];
資料庫<>小提琴
不幸的是,INSERT只允許您OUTPUT從inserted表中,而不是從任何非插入的列。所以我們需要用一個奇怪的方法來破解它MERGE
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340106.html
下一篇:將存盤程序轉換為函式
