RODBC sqlQuery() 在应该返回 varchar(MAX) 时返回 varchar(255)

Posted

技术标签:

【中文标题】RODBC sqlQuery() 在应该返回 varchar(MAX) 时返回 varchar(255)【英文标题】:RODBC sqlQuery() returns varchar(255) when it should return varchar(MAX) 【发布时间】:2014-03-12 23:40:53 【问题描述】:

我正在使用RODBC 包从数据库中查询文本列。该数据库基于 Microsoft SQL Server 2008 R2 构建。 SQL中列的数据类型为nvarchar(max)

但是,当我运行时:

# Set up ODBC connection to CCWEB5 production server
# Note: default database is set to "CCSalary"
ccweb5.prod <- odbcConnect("ccweb5")

# Read in some job ad text
job.text <- sqlQuery(ccweb5.prod,"
  SELECT TOP 100
    ja.JobTitle,
    ja.JobText as 'JobText',
    LEN(ja.JobText) as 'JobTextLength'
  FROM JobStore.dbo.JobAd as ja (NOLOCK)
")

在 SQL 中,我期望(顶行):

JobTitle                     JobText              JobTextLength
IT Field Service Technician  <text goes here...>  2742

但是,当我这样做时:nchar(as.character(job.text[1,2]))

返回:255

所以我的问题是,是什么导致了这种截断,我该如何避免它?谢谢!!

【问题讨论】:

@logworthy 是的,您链接的问题与此问题重复;我在 4 年前问过这个问题,而你链接的那个只有 1 岁左右。 【参考方案1】:

好的,看来我已经找到了解决方法。再谷歌搜索后,我发现:

使用 SQL Native Client ODBC 驱动程序需要考虑的一点是 VARCHAR(MAX) 没有固定大小,并且 ODBC 驱动程序 通过返回最大列大小 0 来表示这一点。这可能会造成混淆 您的应用程序,如果它不检查 0 作为特例。见 本文底部: http://msdn.microsoft.com/en-us/library/ms130896.aspx 但总的来说我 我的任何 .NET 应用程序都没有看到这种情况发生 在 ADO.NET 中正确处理。

来源:http://bytes.com/topic/sql-server/answers/808461-cannot-read-varchar-max

所以,在我的例子中,以下方法成功了:

job.text <- sqlQuery(ccweb5.prod,"
  SELECT DISTINCT TOP 100
    ja.JobTitle,
    [JobText] = CAST(ja.JobText AS varchar(8000)), -- note the data-type re-cast
    [JobTextLength] = LEN(ja.JobText)
  FROM JobStore.dbo.JobAd as ja (NOLOCK)
")

这样nchar(as.character(job.text[1,2])) 现在返回 2742(应该如此)。

我在 *** 上没有看到任何类似的问题,所以我将把它留在这里。希望这对某人有帮助!

【讨论】:

【参考方案2】:

解决方案是将 nvarchar(max) 字段转换为 ntext

job.text <- sqlQuery(ccweb5.prod,"
  SELECT TOP 100
    ja.JobTitle,
    CAST(ja.JobText AS ntext) as 'JobText',
    LEN(ja.JobText) as 'JobTextLength'
  FROM JobStore.dbo.JobAd as ja (NOLOCK)
")

【讨论】:

以上是关于RODBC sqlQuery() 在应该返回 varchar(MAX) 时返回 varchar(255)的主要内容,如果未能解决你的问题,请参考以下文章

RODBC sqlQuery as.is 返回错误结果

RODBC 在 sqlQuery() 的连接中使用 Data.Frame

RODBC-一个sqlQuery()调用中的多个表[重复]

RODBC:为啥 sqlQuery() 中的空值和仅空格值的值为“NA”?

R RODBC sqlQuery 和 WHERE 子句搜索时间戳

如何让 sum 函数在 RODBC 中的 SQLquery 中工作