GAS返回“语句未返回结果集”错误

时间:2013-10-04 19:12:38

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

我收到错误
 我执行以下脚本时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(英特尔X86)2012年5月11日18:41:14版权所有(c)1988-2003 Microsoft Corporation在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放在主人的身上 都给出了同样的错误。
和测试 - stmt.executeUpdate()在sysservers中添加测试时出错...

那么还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

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

我们有一个这样的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脚本脚本开始正常运行。我们希望该解决方案对大家都有效。

祝福!

P.S。如果pyodbc(适用于Python的模块)也同样适用于我们,则会发现同样的问题。

答案 1 :(得分:0)

我发现如果您使用combine_latest而不是executeUpdate(),它不会返回错误,因为它不会指望结果集。

为什么会发生这种情况,请参阅difference between execute, executeQuery and executeUpdate

只有在执行executeQuery()语句时才应该使用它。