由于 SQL Server 2019 Linux 中的错误,需要 node-mssql GET 请求中的解决方法双语句查询(DECLARE;SELECT)

Workaround two-statement query (DECLARE; SELECT) in node-mssql GET request required due to bug in SQL Server 2019 Linux

由于 SQL Server 2019 Linux 中的错误,node-mssql GET 查询应该是一个语句:

router.get('/getresult/:srid/:x/:y', function (req, res) {
    sql.connect(config, error => {
        new sql.Request()
            .input('srid', sql.Int, req.params.srid)
            .input('x', sql.Float, req.params.x)
            .input('y', sql.Float, req.params.y)
            .query('SELECT * from dbo.bTest(geometry::Point(@x,@y,@srid))', (error, result) => {
                         res.send(result.recordset);
                    })
            if (error) {
                console.error(`error: ${error.message}`);
            }
    })
});

现在需要两个语句。使 SQL Server 2019 Linux 崩溃的查询是

SELECT * from dbo.bTest(geometry::Point(@x,@y,@srid))

测试 table 值函数是这样的:

create function dbo.bTest ( @p_geom geometry )
Returns @geometries TABLE
(
  id integer,
  geom geometry
)
as
begin
  declare @g geometry;
  set @g = @p_geom.STBuffer(0.5);      
  insert into @geometries values (1, @g);
return;
end;

在修复之前,我发现的解决方法是在查询中使用两个语句:

DECLARE @wkt geometry = geometry::Point(@x,@y,@srid);
SELECT * FROM dbo.bTest(@wkt);

正如你在下面的dbfiddle中看到的,双语句查询在第二次执行时不会崩溃SQL Server 2019 Linux,而单语句查询会崩溃SQL Server 2019 Linux 第二次执行:

https://dbfiddle.uk?rdbms=sqlserver_2019l&fiddle=4a7759a742f361fc075f35ae6fbdc186

那么,是否可以在 node-mssql GET 请求中使用两个语句(DECLARE 和 SELECT),或者我是否需要将查询放在存储过程中?如果我把它放在存储过程中,我可以使用 node-mssql GET 请求来执行存储过程并取回值吗?我要返回一个 result.recordset,它可以包含一个或多个结果。

编辑:

非常感谢@David 似乎是答案。这似乎适用于 node-mssql GET 请求(查询):

SET NOCOUNT ON;
DECLARE @geom geometry = geometry::Point(@x,@y,@srid);
SELECT * FROM dbo.bTest(@geom);

它连续运行多次并且没有崩溃 SQL Server 2019 Linux。那么生成的 node-mssql router.get 是:

router.get('/getresult/:srid/:x/:y', function (req, res) {
    sql.connect(config, error => {
        new sql.Request()
            .input('srid', sql.Int, req.params.srid)
            .input('x', sql.Float, req.params.x)
            .input('y', sql.Float, req.params.y)
            .query('SET NOCOUNT ON; \
                DECLARE @geom geometry = geometry::Point(@x,@y,@srid)); \
                SELECT * from dbo.bTest(@geom);', (error, result) => {
                         res.send(result.recordset);
                    })
            if (error) {
                console.error(`error: ${error.message}`);
            }
    })
});

不知道您可以在 node-mssql 查询中使用多个语句。 不过稍后,当我想将其投入生产时,我很可能会想要使用准备好的语句。按照我的理解,分号在准备好的语句中是禁止的。是否可以(安全地)使用准备好的语句使用多个语句进行查询而不必使用存储过程? (对于其他问题,我们深表歉意,只是想确保解决方法也适用于准备好的语句,希望这个 SQL Server 2019 Linux 错误能尽快得到修复。

应该可以正常工作。客户并不知道一个批处理是否包含多个语句。在一般情况下,您可能需要在批处理的顶部添加 SET NOCOUNT ON 以禁止为每个语句向客户端发送行数。