簡體   English   中英

Sequelize:批量更新或插入 MSSQL DB

[英]Sequelize: Bulk update or insert into MSSQL DB

我花了過去 24 小時在互聯網上尋找解決方案,但還沒有找到。 我正在嘗試將單個模型批量更新插入(更新或插入)到 mssql 數據庫中。 帶有 updateOnDuplicate:true 的 bulkCreate 不適用於 mssql。 還有其他解決方案嗎? 這是數據集在 1-50k 行之間的任何位置。 任何幫助將不勝感激!

使用 OpenJson 將您的數據轉換為表並與源表合並,如下所示:

const upsertedData = [
  {
    id: "123",
    value: "Value 2"
  },
  {
    id: "124",
    value: "Value 1"
  }
]

const upsert = async (data) => {
  await sequelize.query(
    `BEGIN
      DECLARE @json NVARCHAR(MAX);
      SET @json = :dataToBeUpserted
      MERGE INTO dbo.tableToBeUpserted AS Target
      USING (SELECT * from OpenJson(@json) WITH (
          id nvarchar(32),
          value nvarchar(32),
      )) AS Source
      ON (Target.id = Source.id)
      WHEN MATCHED THEN
      UPDATE SET 
          Target.value = Source.value
      WHEN NOT MATCHED THEN           
          INSERT (id, value)
          VALUES (Source.id, Source.value);
    END`,
    {
      replacements: {
        dataToBeUpserted: JSON.stringify(data)
      },
    }
  )
}

await upsert(upsertedData)

對於 SQL 2016+,您可以簡單地使用 NVarchar(max) 參數將批量數據作為 JSON 傳遞,然后在服務器上解析和加載它。 您的查詢將如下所示:

Insert into TargetTable(Number,Date,Customer,Quantity,[Order])
SELECT Number,Date,Customer,Quantity,[Order]
FROM OPENJSON ( @json )  
WITH (   
              Number   varchar(200)   '$.Order.Number',  
              Date     datetime       '$.Order.Date',  
              Customer varchar(200)   '$.AccountNumber',  
              Quantity int            '$.Item.Quantity',  
              [Order]  nvarchar(MAX)  AS JSON  
 );

您可以將 @json 參數與 NVarchar(max) (字符串)值綁定,例如:

[  
  {  
    "Order": {  
      "Number":"SO43659",  
      "Date":"2011-05-31T00:00:00"  
    },  
    "AccountNumber":"AW29825",  
    "Item": {  
      "Price":2024.9940,  
      "Quantity":1  
    }  
  },  
  {  
    "Order": {  
      "Number":"SO43661",  
      "Date":"2011-06-01T00:00:00"  
    },  
    "AccountNumber":"AW73565",  
    "Item": {  
      "Price":2024.9940,  
      "Quantity":3  
    }  
  }
]

更新將類似於:

 with q as
 (
    select t.Number, t.Quantity oldQuantity, j.Quantity newQuantity 
    from OPENJSON ( @json )  
    WITH (   
                  Number   varchar(200)   '$.Order.Number',  
                  Date     datetime       '$.Order.Date',  
                  Customer varchar(200)   '$.AccountNumber',  
                  Quantity int            '$.Item.Quantity',  
                  [Order]  nvarchar(MAX)  AS JSON  
          ) j
    join TargetTable t
      on j.Number = t.Number
 )
 update q set oldQuantity = newQuantity

請參閱: https : //docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql

如果您無法綁定參數,那么在緊要關頭,您可以將 JSON 文檔作為文字字符串包含在您的 TSQL 批處理中。

暫無
暫無

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

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