由于SQL Server 2019 Linux中存在错误,节点-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))测试表值函数如下:
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
那么,在节点-mssql请求中是否可以使用两个语句(声明和选择),或者我需要将查询放在存储过程中?如果我将其放入存储过程中,是否可以使用节点-mssql请求来执行存储过程并获取返回值?我要返回一个result.recordset,它可以由一个或多个结果组成。
编辑:
很大程度上要感谢大卫给出的答案。这似乎适用于节点-mssql请求(查询):
SET NOCOUNT ON;
DECLARE @geom geometry = geometry::Point(@x,@y,@srid);
SELECT * FROM dbo.bTest(@geom);它连续工作多次,不会使SQLServer2019Linux崩溃。因此,生成的节点-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}`);
}
})
});不知道可以在节点-mssql查询中使用多个语句。但后来,当我想把它推向生产时,我很可能想要使用预先准备好的语句。据我所知,分号在预先准备好的陈述中是完全正确的。是否可以(安全地)使用多个语句使用预先准备好的语句进行查询,而不必使用存储过程?(对于另外一个问题,很抱歉,只想确保准备好的语句也能解决问题,希望这个SQLServer2019 Linux错误很快就能解决)。
发布于 2021-11-19 19:21:55
应该能正常工作。客户端并不真正知道一个批处理是否包含多个语句。在一般情况下,您可能需要在批处理的顶部添加SET NOCOUNT ON,以阻止向客户端发送每条语句的行计数。
https://stackoverflow.com/questions/70038386
复制相似问题