首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决由于Server 2019 Linux中的错误而需要的节点-mssql GET请求中的两条语句查询(声明;选择)

问解决由于Server 2019 Linux中的错误而需要的节点-mssql GET请求中的两条语句查询(声明;选择)
EN

Stack Overflow用户
提问于 2021-11-19 17:02:11
回答 1查看 76关注 0票数 1

由于SQL Server 2019 Linux中存在错误,节点-mssql GET查询应该是一条语句:

代码语言:javascript
复制
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崩溃的查询是

代码语言:javascript
复制
SELECT * from dbo.bTest(geometry::Point(@x,@y,@srid))

测试表值函数如下:

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
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

那么,在节点-mssql请求中是否可以使用两个语句(声明和选择),或者我需要将查询放在存储过程中?如果我将其放入存储过程中,是否可以使用节点-mssql请求来执行存储过程并获取返回值?我要返回一个result.recordset,它可以由一个或多个结果组成。

编辑:

很大程度上要感谢大卫给出的答案。这似乎适用于节点-mssql请求(查询):

代码语言:javascript
复制
SET NOCOUNT ON;
DECLARE @geom geometry = geometry::Point(@x,@y,@srid);
SELECT * FROM dbo.bTest(@geom);

它连续工作多次,不会使SQLServer2019Linux崩溃。因此,生成的节点-mssql router.get是:

代码语言:javascript
复制
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}`);
            }
    })
});

不知道可以在节点-mssql查询中使用多个语句。但后来,当我想把它推向生产时,我很可能想要使用预先准备好的语句。据我所知,分号在预先准备好的陈述中是完全正确的。是否可以(安全地)使用多个语句使用预先准备好的语句进行查询,而不必使用存储过程?(对于另外一个问题,很抱歉,只想确保准备好的语句也能解决问题,希望这个SQLServer2019 Linux错误很快就能解决)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-19 19:21:55

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70038386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档