存储过程的大容量追加(更新或插入)



我正在尝试在存储过程中向SQL Server数据库进行批量追加(更新或插入(,并使用sequelizer使用Node js连接SQL Server数据库。

该数据集位于1-50k行之间。如有任何帮助,我们将不胜感激!

我正在使用sequelizer 在nodejs中尝试这一点

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)
},
}
)
}

upstart(upsertedData(

然而,我得到了这个错误:

关键字"with"附近的语法不正确。如果此语句是通用表表达式、xmlnamespaces子句或更改跟踪上下文子句,则前一条语句必须以分号结束。

我甚至在SQLServerManagementStudio:中尝试过

DECLARE @json NVARCHAR(MAX);
SET @json = N'[
{"id": 2, "info": {"name": "John", "surname": "Smith"}, "age": 25},
{"id": 5, "info": {"name": "Jane", "surname": "Smith"}, "dob": "2005-11-04T12:00:00"}
]';
SELECT *
FROM OPENJSON(@json)
WITH (
id INT 'strict $.id',
firstName NVARCHAR(50) '$.info.name',
lastName NVARCHAR(50) '$.info.surname',
age INT,
dateOfBirth DATETIME2 '$.dob'
);

得到同样的错误:

关键字"with"附近的语法不正确。如果此语句是通用表表达式、xmlnamespaces子句或更改跟踪上下文子句,则前一条语句必须以分号结束。

请帮助我解决此问题。

在SQL 2016之前,您可以使用XML格式。

等效于OPENJSON的是OPENXML

您也可以在SQL Server 2014中使用JSON,请参阅以下文章:

在SQL Server 中使用JSON字符串

SQL Server JSON到表和表到JSON

通过TSQL 从SQL Server查询生成JSON文档

最新更新