簡體   English   中英

NodeJs:一對多批量插入SQL Server

[英]NodeJs : bulk insert into SQL Server one-to-many

我想使用 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

最好的方法是將整個內容批量上傳到 SQL Server,並確保它插入正確的外鍵。

你有兩個選擇

  • 選項1

    • 將主表作為表值參數或 JSON blob 上傳
    • 使用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只允許您從inserted表中OUTPUT ,而不能從任何未插入的列中輸出。 所以我們需要用一個奇怪的MERGE來破解它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM