首页 > 解决方案 > 使用 NodeJS 将大表从流式传输到另一个表

问题描述

我正在尝试从一张桌子复制到另一张桌子。所以我想将大数据流式传输,当它进来时,我想将该数据的内容复制到另一个表中。它不仅仅是一个直接的副本。我可能会稍微整理一下数据,然后将其复制到新表中。我遇到的问题是事件不断触发,我无法控制它。我尝试在我希望让它停止但似乎没有工作的地方使用 async 和 await 。我无法控制事件是否触发。这就是我到目前为止所拥有的。所以基本上我想在 MSSQL 中模拟一个游标。我不想下载所有数据然后对其进行操作。

我没有显示下面的数据按摩,因为我只是想看看我是否可以将数据从一个表复制到另一个表。

var fs = require('fs');
var sql = require('mssql');
var sql2 = require('mssql');
var Request = require('tedious').Request; 
var TYPES = require('tedious').TYPES;  
var SqlString = require('sqlstring');

const config = {
    user: 'xxxx',
    password: 'xxx',
    server: 'xxxx\\',
    port: 'xxxx',
    database: 'xxxx',
    options: {
        instanceName: 'sql2014'
    }
};


function insertRecord(pool, record){
    return new Promise(function(resolve, reject){

        const request = pool.request();

        request.input('invoice_id', sql.Int, record.invoice_id);

        request.query('INSERT INTO _invoice_temp(invoice_id)  VALUES(@invoice_id)', (err, result) => {
            if(err){
                reject(err);
            }

            resolve(1);
        });
     });
}

async function main() {
    try
    {
        let pool = (await sql.connect(config));
        const request = pool.request();
        request.stream = true;
        request.query('select * from invoice');

        var data = await request.on('row', row => {
                return new Promise(function(resolve, reject){
                    resolve(row);
                });
            });

        await insertRecord(pool, data);

    }
    catch(err){
        console.log(err);  
    }
};

main();

标签: node.js

解决方案


如果您想将表从同一个数据库复制到另一个表,那么您应该只在 db 级别下完成它。从数据库中获取数据,然后通过一些服务器端技术(如 Node.js)处理并将其插入到该数据库中,这不是一个好方法。因此,您可以使用原始 SQL 查询来完成您的工作。

将一个表的所有列复制到另一个表:

INSERT INTO table2
SELECT * FROM table1
WHERE condition;

仅将一个表中的一些列复制到另一个表中:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;

您可以在以下链接中了解更多信息: https ://www.w3schools.com/sql/sql_insert_into_select.asp


推荐阅读