RODBC的sqlQuery()函数返回varchar(255)而不是应该返回varchar(MAX)。

7
我将使用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年的历史。 - Ray
2个回答

14

好的,看起来我已经找到了一个解决方法。在更多的谷歌搜索后,我发现:

需要考虑 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上没有看到类似的问题,所以我会把它留下来。希望这能帮助到某些人!


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)
")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接