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() 的连接中使用 Data.Frame
RODBC:为啥 sqlQuery() 中的空值和仅空格值的值为“NA”?