【问题标题】:GAS returns "The statement did not return a result set" errorGAS 返回“语句没有返回结果集”错误
【发布时间】:2020-07-17 02:18:39
【问题描述】:

我在执行以下脚本时收到错误
The statement did not return a result set. (line 9, file "Code"):

var ID = '0AgsrrAUVa01-dGVZVGhWekxsX3Fjieoww0RYMFA2VVE' //profiles
   function test() {
   var profile ="localSQLSERVER"    
   var conn = getConnection(profile,ID)
   var stmt = conn.createStatement();
   //var query = "exec sp_help"
   var query = "exec test.dbo.sp_dasboard_10" 
   var rs = stmt.executeQuery(query);             
   rs.close();
   stmt.close();
   conn.close();
   }

知道上面同一个脚本中注释的exex sp_help 确实可以正常工作。

正确的 Microsoft SQL Server 2000 中的结果也可以正常工作,并且似乎没有返回任何奇怪的东西。只是以下结果
数面食
301
284
211
144
77
77

SQL Server 的版本是:
版本 8.00.2066 (Intel X86) May 11 2012 18:41:14 版权所有 (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

在this post on SO 我读到这可以通过使用executeUpdate() 语句或更新MS SQL 的JDBC 驱动程序来解决。

使用 Google Apps 脚本上的 JDBC 服务不能更新驱动程序... 当我尝试其他选项时,例如
- var pstmt = conn.prepareStatement("exec test.dbo.sp_dasboard_10");
- 将 sp 放入 master
都给出相同的错误。
和测试
- stmt.executeUpdate() 在 sysservers 中添加测试时出错...

还有其他想法吗?

【问题讨论】:

  • 嗨雅各布,也许这只是一个错字?仪表板而不是仪表板?无论如何,这应该做什么?
  • 你试过execute()吗?
  • @HenriqueAbreu 这不是错字...我只是使用了错误的拼写来确保我没有干扰某些保留字。错误也会有所不同Could not find stored procedure 'test.dbo.sp_dashboard_10 和@mark Rotteveel 至于execute() 它返回false。我真的怀疑我必须升级 sql server 或编写单独的查询才能得到结果。
  • 在存储过程中,你是在做一个简单的SELECT 并返回结果吗?是否有其他输出只是表格响应?
  • @ArunNagarajan 结果是一个简单的选择,上面的结果作为输出。尽管在消息中它多次显示消息 1 行受到影响,直到最终结果 6 行受到影响。这是因为在进行最终选择之前,我必须对临时表做一些准备。还有选择后我必须做放置表#temp的细节。

标签: sql-server jdbc google-apps-script


【解决方案1】:

我不认为这么多年后你仍然有同样的问题,但我想向你展示我和我的队友找到的所有解决方案。

我们有一个这样的 SP:

CREATE PROCEDURE USP_GET_SOME_CARS
    @name VARCHAR (50)
AS
BEGIN

    CREATE TABLE #tempTable (
        carName VARCHAR (50),
        carModel VARCHAR(50)
    );

    INSERT INTO #tempTable
    SELECT Name, Model
    FROM Cars
    WHERE Name = @name;

    SELECT *
    FROM #tempTable;

    DROP TABLE #tempTable;

END

当我们尝试执行与您相同的语句 (executeQuery) 时,我们得到了相同的错误:The statement did not return a result set。

经过一段时间的代码搜索和一些测试,我们发现原因比我们想象的要简单。似乎有些语言不能很好地解释结果集,如果你看一下上面的临时代码你会注意到有一个 INSERT,存储过程返回一些受影响的行和 SELECT 语句。

然后,Apps Script 尝试理解响应,但 Apps Script 似乎无法做到这一点,因此它返回 The statement did not return a result set.。解决方法是在SP中加入SET NOCOUNT ON语句,避免受影响的行返回,这样代码如下:

CREATE PROCEDURE USP_GET_SOME_CARS
    @name VARCHAR (50)
AS
BEGIN

    SET NOCOUNT ON; -- This is the added statement

    CREATE TABLE #tempTable (
        carName VARCHAR (50),
        carModel VARCHAR(50)
    );

    INSERT INTO #tempTable
    SELECT Name, Model
    FROM Cars
    WHERE Name = @name;

    SELECT *
    FROM #tempTable;

    DROP TABLE #tempTable;

END

最后,我们的 Apps Script 的脚本开始正常工作了。我们希望这个解决方案对大家有用。

祝福!

附:如果 pyodbc(Python 模块)也适用于你们所有人,我们也发现了同样的问题。

【讨论】:

    【解决方案2】:

    我发现如果你使用executeUpdate() 而不是executeQuery(),它不会返回错误,因为它不需要结果集。

    这里解释了为什么会发生这种情况difference between execute, executeQuery and executeUpdate

    只有在执行SELECT 语句时才应该使用它。

    【讨论】:

    • 好的,我去看看!
    猜你喜欢
    • 2014-08-17
    • 2017-04-02
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多