5

Web データをスクレイピングしていますが、一部の結果は 8K を超えるテキストです。MS SQL Server 2008 R2 に varchar(max) のフィールドがありますが、RODBC は 8K しか保存せず、残りを切り捨てます。SS R2 の SQL Native Client 10 と ODBC 11 の両方を使用して DSN 接続をセットアップしました。

sqlType はフィールド タイトルに -1 を返し、varchar(max)/text を示します。

どちらの接続も、8K でテキストを切り捨てます。これに対する修正/回避策はありますか、それとも SQL Server で 8K に制限されていますか? R mySQL ドライバーが大量のテキストを渡す場合は、MySQL に切り替えることができます。Win 7 x64 で R 3.0.1 と RODBC 1.3-6 を使用しています。

問題を再現するためのサンプル コードを次に示します。

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)

列のタイプをテキストに変更し、DSN 接続を更新しました。テキスト タイプは取得されていますが、エラー メッセージが表示されます。

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

2 に答える 2

1

テキスト列のタイプを に定義したため、データを保存するときvarchar(max)に指定したかどうかに関係なく、そのように保存されvarTypeます。

TEXT代わりに列を持つテーブルを作成してから、 を使用してみてくださいsqlSave。このようにして、データは行のコンテキストの外に格納され、切り捨ての問題は発生しません。

于 2013-08-28T02:52:28.397 に答える