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



我使用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

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

好的,所以看起来我已经找到了解决这个问题的方法。在Google上又搜索了一下,我发现:

使用SQL Native Client ODBC驱动程序需要考虑的一件事是VARCHAR(MAX)没有固定的大小和ODBC驱动程序通过返回最大列大小为0来表示此值。这可能会让人困惑你的应用程序,如果它不检查0作为一个特殊情况。看到本文底部部分:http://msdn.microsoft.com/en-us/library/ms130896.aspx但总的来说我的任何。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(应该的)。

我在StackOverflow上没有看到任何类似的问题,所以我就不提这个了。希望这对大家有所帮助!

解决方案是将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)
")

最新更新