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

时间:2014-03-12 23:40:53

标签: sql sql-server r

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

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

2 个答案:

答案 0 :(得分:13)

好的,好像我找到了一个解决方法。经过更多的Google,我发现:

  

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 (应该如此)。

我在StackOverflow上没有看到任何类似的问题,所以我不予理睬。希望这有助于某人!

答案 1 :(得分:0)

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