【发布时间】:2020-11-09 17:22:24
【问题描述】:
我正在开发一个项目,该项目将从 node.js 程序上传一些记录到 SQL Server。现在,这是我的方法(在异步函数中):
con = await sql.connect(`mssql://${SQL.user}:${SQL.password}@${SQL.server}/${SQL.database}?encrypt=true`);
for (r of RECORDS) {
columns = `([column1], [column2], [column3])`;
values = `(@col1, @col2, @col3)`;
await con
.request()
.input("col1", sql.Int, r.col1)
.input("col2", sql.VarChar, r.col2)
.input("col3", sql.VarChar, r.col3)
.query(`INSERT INTO [dbo].[table1] ${columns} VALUES ${values}`);
}
其中 records 是表单中的对象数组:
RECORDS = [
{ col1: 1, col2: "asd", col3: "A" },
{ col1: 2, col2: "qwerty", col3: "B" },
// ...
];
此代码有效,但是,我觉得它根本没有效率。我上传了大约 4k 条记录,大约需要 10 分钟,看起来不太好。
我相信如果我可以创建单个查询 - 而不是将单个插入包装在 for 循环中 - 使用所有记录值会更快,而且我知道在 SQL 中可以使用语法:
INSERT INTO table1 (column1, column2, column3) VALUES (1, "asd", "A"), (2, "qwerty", "B"), (...);
但是,我无法从 mssql 模块中找到任何有关如何准备参数化输入以在单个事务中完成所有操作的文档。
谁能引导我走向正确的方向?
提前致谢。
【问题讨论】:
-
好的,我已经尝试按照您发送给我的链接进行操作,但我遇到了一些错误。
VarChar(max)字段有一个复杂性,我认为它是用{length: infinity}整理的,但我有一些列类型错误。让我给它更多时间再回复你 -
没关系,这是我的错,这个成功了,谢谢华金
标签: node.js sql-server tedious node-mssql