【问题标题】:Missing letters of database objects being returned in DBI SQL Server ODBC connectionDBI SQL Server ODBC 连接中返回的数据库对象缺少字母
【发布时间】:2020-02-21 07:30:39
【问题描述】:

不幸的是,如果不将机密凭据共享给我遇到问题的数据库,我将无法为这个问题创建一个好的重现。希望我在下面有足够的信息来标记任何 ODBC 专家能够理解的明显问题。

背景

我正在运行具有以下规格的 MacBook Pro:

  Model Name:       MacBook Pro
  Model Identifier: MacBookPro15,1
  Processor Name:   6-Core Intel Core i7
  Processor Speed:  2.6 GHz
  Number of Processors: 1
  Total Number of Cores:    6
  L2 Cache (per Core):  256 KB
  L3 Cache: 9 MB
  Hyper-Threading Technology:   Enabled
  Memory:   32 GB
  Boot ROM Version: 1037.0.78.0.0 (iBridge: 17.16.10572.0.0,0)

我的 ODBC 连接是使用 here 指定的 FreeTDS 设置的。

freetds.conf的相关部分如下:

# The POC SQL Server
[POC]
host = 172.22.238.154
port = 1433
tds version = 7.3

我的odbcinst.ini文件如下:

[FreeTDS]
Description=FreeTDS Driver for Linux & SQL Server 
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=1

我的odbc.ini文件指定如下:

[POC]
Description         = Connecton to Partners for our children SQL Server 
Driver              = FreeTDS
Servername          = POC

我正在尝试使用 R 中的以下连接信息连接到 SQL Server 2012 数据库(通过 VPN):

con <- DBI::dbConnect(odbc::odbc()
                  ,dsn = "POC"
                  ,uid = Sys.getenv("MSSQL_UN")
                  ,database = "CA_ODS"
                  ,pwd = Sys.getenv("MSSQL_PW"))

这会生成以下连接对象:

> con
  <OdbcConnection> POC2
  Database: CA_ODS
  Microsoft SQL Server Version: 11.00.7001

通常,此连接按预期工作。我可以毫无问题地使用DBI::dbGetQuery(con, "select * from MyTable")dplyr::tbl(con, MyTable) 等查询数据库。

问题

然而,RStudio 仅显示数据库对象的每隔一个字母,并在前几个字母之后截断对象名称。下面的截图应该很好地说明了这个问题:

我尝试连接的数据库名为CA_ODS。但是,RStudio 对象浏览器仅显示数据库名称的所有其他字母(即 DB 列为 C_D)。

这似乎也不限于 RStudio本身。虽然实际数据库查询的结果如上所述工作正常,但从INFORMATION_SCHEMA 返回的名称似乎与对象浏览器中的信息匹配。下面,当直接从 SQL Server Management Studio 运行时,返回的TABLE_CATALOGCA_ODSTABLE_SCHEMAndacan,等等。但是,当通过数据库连接运行时,我得到以下信息。

> DBI::dbGetQuery(con, "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE 
TABLE_SCHEMA='ndacan'")
   TABLE_CATALOG TABLE_SCHEMA      TABLE_NAME TABLE_TYPE
1            C_D          naa            f21v BASE TABLE

问题

关于如何在 R 或 FreeTDS 配置中重新指定我的 ODBC 连接以获取返回的数据库对象的全名的任何建议?

【问题讨论】:

  • 可能相关:github.com/r-dbi/odbc/issues/283。我的猜测是您的 macos 正在运行 R-3.6。似乎有两件事对某些人有用:(1)降级到 R-3.5.3; (2) 重新安装odbcfrom source(不是CRAN 二进制文件)。
  • @r2evans 这为我修复了它(即install.packages("odbc", type = 'source')
  • 如果您想提供答案,我会接受。无关(在升级到 Catalina 之前我遇到了这个问题,但 Catalina 似乎已经使用 XCode) - 我需要重新安装 XCode,然后才能从源代码安装 odbcxcode-select --install 应该为 XCode 解决问题
  • 我相信你回答自己(用你所采取的步骤)会更可信:我没有 macos,只是转发第三方对话。另一方面,你做得更多。除了自我回答之外,在对原始问题 (github.com/r-dbi/odbc/issues/283) 的评论中包含您采取的额外 Xcode 步骤可能会有所帮助,因为他们仍在解决这个问题。谢谢!

标签: r sql-server odbc freetds r-dbi


【解决方案1】:

正如@r2evans cmets 中所述,这似乎是在 Mac 上以 R 3.6.0 运行的odbc 的问题。

一般来说,这似乎可以通过从源 install.packages("odbc", type = 'source') 重新安装 odbc 来解决。

正如 cmets 中所指出的,我最近将我的 Mac 升级到了 Catalina。 从源代码安装odbc 之前,我需要先从我的终端使用xcode-select --install 重新安装XCode。

从下面的屏幕截图中可以看出,我现在从odbc 连接中获取显示的完整对象名称。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 2022-11-29
  • 2015-09-28
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多