2013-08-28 27 views
5

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) 

Trả lời

1

Bạn định nghĩa cột văn bản là loại varchar(max), vì vậy nó sẽ được lưu trữ theo cách đó, không phân biệt quy định cụ thể varType khi lưu dữ liệu.

Thay vào đó, hãy thử tạo một bảng có cột TEXT, sau đó sử dụng sqlSave. Bằng cách này, dữ liệu sẽ được lưu trữ ngoài ngữ cảnh hàng và bạn sẽ không gặp phải vấn đề cắt ngắn.

+1

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

0

Tôi đã có một vấn đề tương tự và kết thúc cách làm như sau:

# Finding the longest character 
varTypes = c(col_in_question=sprintf("varchar(%s)", max(nchar(data$col_in_question)))) 

# Uploading data 
sqlSave(channel = dbhandle, 
     dat = data, 
     tablename = "data_name", 
     rownames = FALSE, 
     varTypes = varTypes) 

Bằng cách này, bạn thiết lập các varchar để tối đa trong bộ dữ liệu của bạn, và nếu bạn không có bất kỳ nhân vật cực kỳ dài (2 Gb) nó sẽ hoạt động. Nếu bạn nhấn mạnh vào varchar (max), thì bạn có thể thay đổi nó trong tập dữ liệu của bạn sau khi sử dụng sqlQuery.

Các vấn đề liên quan