Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 续集:批量更新或插入MSSQL数据库_Javascript_Sql_Sql Server_Node.js_Sequelize.js - Fatal编程技术网

Javascript 续集:批量更新或插入MSSQL数据库

Javascript 续集:批量更新或插入MSSQL数据库,javascript,sql,sql-server,node.js,sequelize.js,Javascript,Sql,Sql Server,Node.js,Sequelize.js,我花了24小时在互联网上寻找解决方案,但还没有找到。我正在尝试将单个模型的批量上传(更新或插入)到mssql数据库中。bulkCreate with updateOnDuplicate:true不适用于mssql。还有其他解决办法吗?这是一个介于1-50k行之间的数据集。任何帮助都将不胜感激 对于SQL 2016+,您只需使用NVarchar(max)参数将批量数据作为JSON传递,然后解析并加载到服务器上即可。您的查询如下所示: Insert into TargetTable(Number,D

我花了24小时在互联网上寻找解决方案,但还没有找到。我正在尝试将单个模型的批量上传(更新或插入)到mssql数据库中。bulkCreate with updateOnDuplicate:true不适用于mssql。还有其他解决办法吗?这是一个介于1-50k行之间的数据集。任何帮助都将不胜感激

对于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)(string)值绑定,如:

[  
  {  
    "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
见:


如果无法绑定参数,那么在必要的情况下,您可以将JSON文档作为文本字符串包含在TSQL批处理中。

对于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)(string)值绑定,如:

[  
  {  
    "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
见:


如果无法绑定参数,则在必要时,可以将JSON文档作为文本字符串包含在TSQL批处理中。

使用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)

使用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)

我很感激你的回答,这其实是一个有趣的方式。通常,我会将TVP与合并存储过程一起使用,类似于此处注释中概述的内容:。但问题不在于如何在SQL中实现这一点,而在于如何使用Sequelize实现这一点。我知道如何在SQL中实现它,但是Sequelize应该有这个功能。传递JSON的性能应该类似于TVP,但不需要客户机驱动程序提供任何特殊的API支持。对于更新,请将OPENJSON创建的表与目标表连接,然后更新。看上面。我很感激你的回答,这其实是一个有趣的方式。通常,我会将TVP与合并存储过程一起使用,类似于此处注释中概述的内容:。但问题不在于如何在SQL中实现这一点,而在于如何使用Sequelize实现这一点。我知道如何在SQL中实现它,但是Sequelize应该有这个功能。传递JSON的性能应该类似于TVP,但不需要客户机驱动程序提供任何特殊的API支持。对于更新,请将OPENJSON创建的表与目标表连接,然后更新。见上文。