节点 SQL Server mssql 流

use*_*272 5 sql sql-server streaming node.js

我是 node 的新手,正在使用mssql它来连接到 SQL Server。任何人都可以帮助我提供一个更完整的mssql流媒体示例。我发现 git 示例含糊不清,不知道从哪里开始。任何帮助将不胜感激。

var sql = require('mssql'); 

var config = {
    user: '...',
    password: '...',
    server: 'localhost', // You can use 'localhost\\instance' to connect to named instance
    database: '...',
    stream: true, 

    options: {// Use this if you're on Windows Azure
    }
}

sql.connect(config, function(err) {


    var request = new sql.Request();
    request.stream = true; // You can set streaming differently for each request
    request.query('select * from verylargetable'); // or request.execute(procedure);

    request.on('recordset', function(columns) {
        // Emitted once for each recordset in a query
    });

    request.on('row', function(row) {
        // Emitted for each row in a recordset
    });

    request.on('error', function(err) {
        // May be emitted multiple times
    });

    request.on('done', function(returnValue) {
        // Always emitted as the last one
    });
});
Run Code Online (Sandbox Code Playgroud)

wjv*_*der 9

我要去神圣的死灵这个帖子,因为我今天遇到了同样的问题,想留下一些可能对我未来有帮助的东西。

根据ExpressJs 文档,流式传输任何大型数据集的正确方法是将write其发送到响应,flush偶尔响应,然后在完成后end响应。

mssqlNPM指出,有你可以订阅,像他们的文档中的摘录列出的几个事件。这很好,但你如何整合两者?

好吧,我想出了以下解决方案(可能不是最好的,但是嘿,它有效)

这个想法是从 SQL 记录中流式传输数据以进行记录,但只将数据以 50 为一组刷新到调用者。完成后,结束响应。

我还需要它恢复Array格式,所以我必须为此构建开头、分隔符和结尾。

exports.listAllRecordsInReallyBigDataTable = (req, res) => {
  const config = {
    ...
  }

  sql.connect(config, () => {
    res.setHeader('Cache-Control', 'no-cache');

    const request = new sql.Request();
    request.stream = true;
    request.query('select * from myBigTableOrView');

    let rowCount = 0;
    const BATCH_SIZE = 50;

    request.on('recordset', () => {
      res.setHeader('Content-Type', 'application/json');
      res.write('[');
    }

    request.on('row', row => {
      if (rowCount > 0)
        res.write(',');

      if (rows % BATCH_SIZE === 0)
        res.flush();

      res.write(JSON.stringify(row));
      rowCount++;
    }

    request.on('done', ()=> {
      res.write(']');
      sql.close();
      res.end();
    };
  };
};
Run Code Online (Sandbox Code Playgroud)