节点mssql临时表丢失-RequestError:无效的对象名'#myTempTable'

时间:2019-01-23 05:57:49

标签: node.js sql-server temp-tables tedious

我正在使用node-mssql并从docker连接到2017 sql服务器。

问题

我在整个脚本中放了

var test = await dbRequest().batch("SELECT * FROM #myTestTable");

间歇地,我收到错误RequestError: Invalid object name '#myTempTable'。因此,我在sql.ConnectionPool上放了一些手表以识别发生什么情况导致错误。事实证明,在大多数执行行中,pool.pool.available变量为1,如下所示。

enter image description here

每当发生错误时,在进入下一行之前,pool.pool.available均为0,这样:

enter image description here

如果在运行之前立即发生 var test = await dbRequest().batch("SELECT * FROM #myTestTable");

它将失败并 RequestError: Invalid object name '#myTempTable'

我尝试过的事情

我尝试使用{min: 100, max: 1000, log: true}将池配置发送到Tedious,但不幸的是,它似乎被忽略了(https://www.npmjs.com/package/mssql#connection-pools

var sqlServerProperty = {
    user: '',
    password: '',
    server: '192.168.1.13',
    database: 'CCTDB',
    pool: {min: 1, 
        max: 100, 
        idleTimeoutMillis: 30000}
};

我也只尝试了一个pool.request()并从中运行所有dbRequest。没有骰子!

任何帮助表示赞赏!

dbRequest()是什么样的?

// the entire script is wrapped in an async function
        var pool = new sql.ConnectionPool(sqlServerProperty);
        await pool.connect();
        var dbRequest = ( () => { return pool.request() });

2 个答案:

答案 0 :(得分:5)

该错误消息仅表示初始会话(或连接)已关闭并且新会话已开始。临时表具有会话的生存期。为了解决此问题,请确保您的逻辑可以保留打开的连接,直到不再需要#temp表为止

我不是nodejs方面的专家,但是快速的research告诉我们:

  

有一个清晰的方法-只需使用以下命令初始化Connection   pool.min选项设置为1 (或更高)。这意味着必须存在   池中至少有一个活动连接。数字越大意味着更多   并发活动连接。

您是否尝试过类似的方法?:

pool: {min: 20, 
        max: 100, 
        idleTimeoutMillis: 30000}

在这种情况下,将建立更多的连接,因此在某个时间点有更多的连接可用,并且将减少您的会话由于被其他人使用而关闭的机会

答案 1 :(得分:1)

要确保系列中的所有批次都在同一连接下执行,您还可以使用Transactions:https://www.npmjs.com/package/mssql#transaction

请注意,事务将锁定记录直到提交,这可能会导致数据库阻塞。