2014-03-12 158 views
5

我正在使用RODBC包来从数据库中查询文本列。该数据库建立在Microsoft SQL Server 2008 R2上。 SQL中列的数据类型是nvarchar(max)当它应该返回varchar(MAX)时,RODBC sqlQuery()返回varchar(255)

然而,当我运行:

# 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]))

它返回:。

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

回答

12

好的,所以我似乎找到了解决这个问题的方法。一些Google'ing后,我发现:

有一点要考虑与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]))现在返回(因为它应该)。

我没有在StackOverflow上看到任何类似的问题,所以我会留下来。希望这可以帮助别人!