2

我正在使用 SQL Server 2008 R2 并尝试使用 Google Apps 脚本对其进行查询。我正在使用应该填充电子表格的建议脚本之一,但我在连接 SQL 时遇到问题。

我已经检查了我指定的端口是否正确,所以我怀疑问题是否存在,我非常感谢确认我的连接字符串是正确的。

这是代码 -

服务器/实例:1433;数据库名称=xxxx;用户=xxxx;密码=xxxx");

function foo() {
  var conn = Jdbc.getConnection   ("jdbc:sqlserver/instance:1433;databaseName=xxxx;user=xxxx;password=xxxx");
  var stmt = conn.createStatement();
  stmt.setMaxRows(100);
  var start = new Date();
  var rs = stmt.executeQuery("select top 1000 from SOP10100");

  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var cell = doc.getRange('a1');
  var row = 0;
  while(rs.next()) {
    cell.offset(row, 0).setValue(rs.getString(1));
    cell.offset(row, 1).setValue(rs.getString(2));
    cell.offset(row, 2).setValue(rs.getString(3));
    cell.offset(row, 3).setValue(rs.getString(4));
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
  var end = new Date();
  Logger.log("time took: " + (end.getTime() - start.getTime()));

谢谢你的帮助!

4

3 回答 3

2

我认为您的连接字符串格式略有错误。我相信您sqlserver://在服务器名称/实例之前需要一个。

我没有方便的 SQL Server 实例,但我针对 SQL Azure 测试了以下代码,它运行良好。我能够从名为 helloworld 的表中选择数据并将其写入电子表格。

我已经用占位符替换了我的凭据。

function readAzure() {
  var conn = Jdbc.getConnection("jdbc:sqlserver://XYZ.database.windows.net:1433;databaseName=MYDATABSENAME","USERNAME","PASSWORD");
  var stmt = conn.createStatement();
  var rs = stmt.executeQuery("select * from helloworld");

  var doc = SpreadsheetApp.create('azure');
  var cell = doc.getRange('a1');
  var row = 0;
  while(rs.next()) {
    cell.offset(row, 0).setValue(rs.getString(1));
    cell.offset(row, 1).setValue(rs.getString(2));
    row++;
  }
  rs.close();
  stmt.close();
  conn.close();
}
于 2013-03-19T14:53:58.010 回答
2

我在 GitHub 上有一个完整的项目,它是一个 Mysql 和 SQL Server JDBC 连接应用程序。你可以在这里找到它:GitHub 项目。我已经在下面发布了相关代码。SQL Server 案例是您为连接实例化参数的地方,下面是连接的其余部分。要获得整个工具,请使用 GitHub 项目。

  function readFromTable(queryType, queryDb, query, tab, startCell) {
  // Replace the variables in this block with real values.
  var address;
  var user;
  var userPwd ;
  var dbUrl;

  switch(queryType) {
    case 'sqlserver':
      address = '%YOUR SQL HOSTNAME%';
      user = '%YOUR USE%';
      userPwd = '%YOUR PW%';
      dbUrl = 'jdbc:sqlserver://' + address + ':1433;databaseName=' + queryDb;
      break;
    case 'mysql':  
      address = '%YOUR MYSQL HOSTNAME%';
      user = '%YOUR USER';
      userPwd = '%YOUR PW%';
      dbUrl = 'jdbc:mysql://'+address + '/' + queryDb;
    break;
  }

  var conn = Jdbc.getConnection(dbUrl, user, userPwd);
  var start = new Date();
  var stmt = conn.createStatement();
  var results = stmt.executeQuery(query);
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheetTab = sheet.getSheetByName(tab);
  var cell = sheetTab.getRange(startCell);
  var numCols = results.getMetaData().getColumnCount();
  var numRows = sheetTab.getLastRow();
  var headers ;
  var row =0;

  clearRange(tab,startCell,numRows, numCols);


  for(var i = 1; i <= numCols; i++){
    headers = results.getMetaData().getColumnName(i);
      cell.offset(row, i-1).setValue(headers);
      }

  while (results.next()) {
    var rowString = '';
    for (var col = 0; col < numCols; col++) {
      rowString += results.getString(col + 1) + '\t';
      cell.offset(row +1, col).setValue(results.getString(col +1 ));
    }
    row++
    Logger.log(rowString)
  }

  results.close();
  stmt.close();

  var end = new Date();
  Logger.log('Time elapsed: %sms', end - start);
}
于 2017-06-26T20:38:27.160 回答
1

我已经破解了 :).... 至少对于我们的 SQL Server 和 google 电子表格!

感谢所有的帮助。我一直在这里阅读一些问题,现在我想分享您帮助我构建的内容。我已经构建了一个函数,它可以接受 SQL 查询并将结果输出到其所在的电子表格中。

要获取电子表格上的数据,您需要打开一个谷歌电子表格并转到“工具”>“<> 脚本编辑器”。然后通过下面的代码说明并包含“/ **** .....”。接下来,您将不得不更新代码中的这些位

var address = 'yourServerUrl:yourPortNumber';
var user = 'yourUserName';
var userPwd = 'yourPassword';
var db = 'yourDatabaseName';

然后你需要保存它并返回到电子表格并输入

=SQLTOGOOGLOOGLESPREADSHEET("yourSqlQuery")

进入电子表格单元格

/***********************

@CUSTOMFUNCTION

*/

function SQLTOGOOGLOOGLESPREADSHEET(sqlQuery) {
    var address = 'yourServerUrl:yourPortNumber';
    var user = 'yourUserName';
    var userPwd = 'yourPassword';
    var db = 'yourDatabaseName';
    var msSqlUrlSyntax ='jdbc:sqlserver://'

    var dbUrl = msSqlUrlSyntax + address + ';databaseName=' + db;

    // msSqlUrlSyntax = 'youOptionalTestingQuery'
    var conn = Jdbc.getConnection(dbUrl, user, userPwd);

    var start = new Date();
    var stmt = conn.createStatement();
    stmt.setMaxRows(1000);

    var results = stmt.executeQuery(sqlQuery);
    var numCols = results.getMetaData().getColumnCount();
    var numRows = results.getFetchSize()
    Logger.log(numRows)
    var dataArray = [];

    while (results.next()) {
        var rowString = [];   
        rowString = [];

        for (var col = 0; col < numCols; col++)     
        {
            rowString.push(results.getString(col + 1))
        }

        dataArray[dataArray.length]=rowString;
    }

    Logger.log("dataArray =" + dataArray)
    return dataArray

    results.close();
    stmt.close();

    var end = new Date();
    Logger.log('Time elapsed: %sms', end - start);
}
于 2018-03-18T11:10:10.703 回答