【问题标题】:Bulk insert data in mssql table using node mssql使用节点 mssql 在 mssql 表中批量插入数据
【发布时间】:2014-12-08 23:04:45
【问题描述】:

我正在使用node-mssql

我的查询文件如下

BEGIN TRANSACTION
DECLARE @status NVARCHAR(30);
SET @status = 'create';
DECLARE @i UNIQUEIDENTIFIER;
SET @i = NEWID();
DECLARE @t DATETIME2;
SET @t = SYSUTCDATETIME();
IF NOT EXISTS( 
    SELECT * FROM user WHERE email = @email AND company_id= @company_id
) BEGIN
SET @i = NEWID();
INSERT INTO user (comapny_id, id, email, password) VALUES ( @company_id, @i, @email, @password);
INSERT INTO user_transaction( id, date, type) VALUES ( @i, @t, @status);
SELECT @i as 'id', @email as 'email';
END ELSE BEGIN
SELECT NULL as 'id', @email as 'email';
END
COMMIT TRANSACTION

而我在 query.js 文件中的 createuserquery 是

 datastore.getQueryFromSqlFile('create_user', (err: any, query: string) => {
    if (err) {
        done(err);
    } else {
        var request = new sql.Request(connectionOrTransaction);
        request.input('email', sql.NVarChar(200), email);
        request.input('password', sql.NVarChar(200), some_password);
        request.input('company_id', sql.UniqueIdentifier, company_id);
        request.query(query, function (err, data) {});

现在我需要修改这些以插入从 CSV 文件导入的大量用户数据(>20000 个条目) 我正在考虑做类似的事情

 async.mapSeries(Object.keys(users), function (item, callback) {
     query.createuser(email, company_id, function (err, data) {
         callback(err, err ? 'Error message: ' + data : data);        
     });
 }, function (err, results) {
 })

但这效率不高,因为我遇到了连接超时。在配置文件中增加connectionTimeoutrequestTimeout 并没有多大帮助。

对于每次尝试大约 20000-40000 个条目的批量插入,我怎样才能使我的查询更快?

【问题讨论】:

    标签: sql-server node.js bulkinsert node-mssql


    【解决方案1】:

    对我来说,这看起来像是一份准备好的陈述。

    var ps = new sql.PreparedStatement();
    ps.input('email', sql.VarChar);
    ps.input('password', sql.VarChar);
    ps.input('company_id', sql.Int);
    ps.prepare(" ... your sql ... ", function(err) {
        // ... error checks
    
        // users must be an array of users
        async.mapSeries(users, function(user, next) {
            ps.execute({email: user.email, password: user.password, company_id: user.company_id}, next);
        }, function(err) {
            // ... error checks
    
            ps.unprepare(function(err) {
                // ... error checks
    
                // done !
            });
        });
    });
    

    每个execute 都被称为一个请求,因此您不应被requestTimeout 超时。 connectionTimeout 是只影响连接阶段的东西。连接到 db 后,只有 requestTimeout 很重要。

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多