我使用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。
所以我的问题是,导致这种截断的原因是什么,我该如何避免呢?谢谢!!
好的,所以我似乎找到了解决方法。经过一些谷歌,我发现:
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上没有看到任何类似的问题所以我会把它留下来。希望这有助于某人!
解决方案是将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)
")