一尘不染

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

sql

我正在使用该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

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


阅读 150

收藏
2021-05-05

共1个答案

一尘不染

好的,看来我已经找到了解决方法。经过更多Google搜寻后,我发现:

SQL Native Client
ODBC驱动程序要考虑的一件事是VARCHAR(MAX)没有固定的大小,而ODBC驱动程序通过返回最大列大小0来表示此大小。如果不检查其大小,这可能会使您的应用程序感到困惑特殊情况下为0。
请参阅本文的底部:http :
//msdn.microsoft.com/zh-
cn/library/ms130896.aspx但是,总的来说,我在任何.NET应用程序中都没有看到这种情况,因为它在ADO中得到了正确处理。网。

来源: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上没有看到任何类似的问题,所以我将其保留。希望这对某人有帮助!

2021-05-05