Google Apps 脚本 JDBC 连接到 Azure SQL 数据库 - 类型映射问题

Google Apps Script JDBC connection to Azure SQL db - type mapping problem

我正在尝试从 Google Apps 脚本(现在用于测试的独立脚本)连接到我的 Azure SQL 数据库, 使用 Apps Script JDBC Service.

// connection string (dbUrl): jdbc:sqlserver://...
var conn = Jdbc.getConnection(dbUrl, user, userPwd); 
var stmt = conn.createStatement();
var rst = stmt.executeQuery('SELECT [ID], [DatetimeColumn], [Datetime2Column], [DateColumn], [TimeColumn] FROM [gscript].[testTable]')
// etc.

我遇到 某些(更新的?)SQL 服务器 date/time 数据类型的类型映射 问题:datetime2datetime。这些在我的脚本 (rst.getObject) 中被映射和获取为 NVARCHAR,即 作为字符串 (也由结果集元数据确认,见下文)。

只有 datetime 有效 - 映射为 java.sql.Timestamp

检查数据库和结果集元数据时,得到:

结果集 - SQL 服务器数据类型 datetime2datetime 的列:

getColumnClassName: java.lang.String, getColumnType: -9, getColumnTypeName: nvarchar

数据库 - 驱动程序信息:

getDriverName: Microsoft SQL Server JDBC Driver 2.0 / getDriverVersion: 2.0.1803.100 / getDriverMajorVersion: 2 / getDriverMinorVersion: 0 getJDBCMajorVersion: 4 / getJDBCMinorVersion: 0

有人能帮忙吗?

低驱动版本的问题吗?能否以某种方式安装更新的驱动程序?

(我的 DBeaver 桌面应用程序显示 Microsoft JDBC Driver for SQL Server (MSSQL) version 7.4.1, 相同 [=93= 没有类型映射问题].)

或者是否有必要避免提到的数据类型而只使用 datetime

还是继续使用 NVARCHAR 并解析脚本中的数据是更好的做法?

编辑:

经过进一步的研究,我在 SQL Server T-SQL reference 中发现了这个: "Some down-level clients don't support the time, date, datetime2, and datetimeoffset data types..." 似乎它描述了我的问题。问题是,这可以在 Google Apps 脚本中以某种方式克服吗?

根据您的发现,Apps 脚本的内置服务似乎仅限于 JDBC 2.0。

如果是这样它只能支持DATETIMETIMESTAMP数据类型来自 JDBC 1.0/2.0 (see documentation)。因此相对较新的 SQL 服务器数据类型将不受支持。

有几种方法可以解决这个问题。

您可以更改 MSSQL 表的 date/time 字段以使用更兼容的数据类型,但这可能意味着重构您的数据库和任何依赖它的现有代码。

一种侵入性较小的方法是在数据库服务器上创建存储过程,将这些数据类型转换为 App Script JDBC 服务可以处理和调用存储过程的格式,而不是直接查询表。

或者,您也可以尝试使用 the getter methods on the JdbcResultSet object 将传入数据强制转换为 date/time 类型(不确定这是否可行,但值得一试)。