Tôi đang xoá dữ liệu web và một số kết quả có hơn 8K văn bản. Tôi có một lĩnh vực trong MS SQL Server 2008 R2 của tôi đó là varchar (tối đa) nhưng RODBC chỉ tiết kiệm 8K và cắt bớt phần còn lại. Tôi có các kết nối DSN được thiết lập bằng cả SQL Native Client 10 từ SS R2 và ODBC 11.RODBC không lưu lớn hơn 8k varchar/văn bản từ khung dữ liệu
sqlType trả về -1 cho tiêu đề trường, biểu thị varchar (max)/text.
Cả hai kết nối cắt ngắn văn bản ở 8K. Có một sửa chữa/workaround cho điều này hoặc tôi bị giới hạn đến 8K trong SQL Server? Tôi có thể chuyển sang MySQL nếu trình điều khiển R mySQL sẽ truyền lượng văn bản lớn hơn. Tôi đang sử dụng R 3.0.1 và RODBC 1.3-6 trên Win 7 x64.
Dưới đây là một số mã mẫu để tái tạo sự cố.
CREATE TABLE
[test](
[title] [varchar](max) NULL
) ON [PRIMARY]
library(RODBC)
ch <- odbcConnect("text", uid = "X", pwd = "X")
sqlTypeInfo(ch,"test")
testtext = data.frame("salasjflsjsf")
colnames(testtext) = "title"
## This works
sqlSave(ch,testtext,"test",append=TRUE, rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE)
## text > 8K
testtext = data.frame(paste(rep("salasjflsjsf",5000),collapse=""))
colnames(testtext) = "title"
## use ODBC default type for title
sqlSave(ch,testtext,"test",append=TRUE, rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE)
## this message from ODBC
## Query: INSERT INTO "test" ("title") VALUES (?)
## Binding: 'title' DataType 12, ColSize 8000
## Parameters:
## no: 1: title salasjfl
## [*text removed*]
## lsjsfsalasjflsjsfsalasjflsjsfsalasjflsjsfsalasjflsjsfsalasjflsjsfsalasjflsjsf/***/
## Warning message:
## In odbcUpdate(channel, query, mydata, coldata[m, ], test = test, :
## character data 'salasjflsjsfsalasjflsjsfsalasjflsjsfsalasjfl
## try with varType set to text
sqlSave(ch,testtext,"test",append=TRUE, varType = "text",rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE)
## try with varType set to varchar(MAX)
sqlSave(ch,testtext,"test",append=TRUE, varType = "varchar(max)",rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE)
close(ch)
Tôi đã thay đổi loại cột thành văn bản và làm mới kết nối DSN. loại văn bản đang được nhặt nhưng bây giờ có một thông báo lỗi:
chtest <-odbcConnect("test2", uid = "X", pwd = "X")
> sqlColumns(chtest,"test")
TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS
1 RSS dbo test title -1 text 2147483647 2147483647 NA NA 1 <NA>
COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SS_IS_SPARSE SS_IS_COLUMN_SET SS_IS_COMPUTED
1 <NA> -1 NA 2147483647 1 YES 0 0 0
SS_IS_IDENTITY SS_UDT_CATALOG_NAME SS_UDT_SCHEMA_NAME SS_UDT_ASSEMBLY_TYPE_NAME SS_XML_SCHEMACOLLECTION_CATALOG_NAME
1 0 <NA> <NA> <NA> <NA>
SS_XML_SCHEMACOLLECTION_SCHEMA_NAME SS_XML_SCHEMACOLLECTION_NAME SS_DATA_TYPE
1 <NA> <NA> 35
> sqlSave(chtest,testtext,"test",append=TRUE, varType = "text",rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE)
Query: INSERT INTO "test" ("title") VALUES (?)
Binding: 'title' DataType -1, ColSize 2147483647
Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test, :
'Calloc' could not allocate memory (18446744071562067968 of 1 bytes)
In addition: Warning messages:
1: In odbcUpdate(channel, query, mydata, coldata[m, ], test = test, :
Reached total allocation of 6013Mb: see help(memory.size)
2: In odbcUpdate(channel, query, mydata, coldata[m, ], test = test, :
Reached total allocation of 6013Mb: see help(memory.size)
Aert, tôi đã kiểm tra đề xuất của bạn nhưng có lỗi khi lưu dữ liệu. Xem kết quả dưới đây. – user2720047