簡體   English   中英

由於 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))

測試表值 function 是這樣的:

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);

As you can see in the following dbfiddle, the two statement query does not crash SQL Server 2019 Linux when it is executed the second time, whereas the single statement query crashes SQL Server 2019 Linux on the second execution:

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

那么,是否可以在 node-mssql GET 請求中使用兩個語句(DECLARE 和 SELECT),或者我需要將查詢放在存儲過程中嗎? 如果我把它放在一個存儲過程中,我可以使用 node-mssql GET 請求來執行一個存儲過程並取回值嗎? 我正在返回一個 result.recordset,它可以包含一個或多個結果。

應該可以正常工作。 客戶並不真正知道批處理是否包含多個語句。 在一般情況下,您可能需要在批處理頂部添加SET NOCOUNT ON以禁止將每個語句的行數發送到客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM