2017-12-15 8 views
0

私はSQL Server 2012のデータベースにRからdata.tableを挿入しよう:アップロード - エラー "文字列データ、右切り捨て" はnvarchar対列タイプのCHR(50)

library(data.table) 
library(odbc) 
library(dplyr) 

upload.data <- data.table(readxl::read_excel(path = uploadfile.file, sheet = 
sheet_no, skip = skip_rows), col_names = TRUE) 

odbcChannel <- dbConnect(odbc::odbc(), "SQL") 

dbWriteTable(odbcChannel, "Table_Name", upload.data, append = TRUE, overwrite = FALSE, row.names=FALSE, encoding = "latin1") 

データテーブルの列は、chr型です。 SQL Serverのターゲットテーブルの列は、varchar(50)です。

私の理解では、chrはvarchar(255)としてアップロードされます。このため、私はエラーが発生します:

Error in result_insert_dataframe([email protected], values) :
nanodbc/nanodbc.cpp:1587: 22001: [Microsoft][ODBC SQL Server Driver]String data, right truncation

データベースのテーブルの特定のニーズに合わせてRの列を変更するにはどうすればよいですか?

データベーステーブルに収まらないコンテンツが列にある場合は、情報がなくなることを望みます。

一つの解決策:サーバーに新しいテーブルにデータテーブルをアップロードして一致させるタイプの編集より:この後

dbSendStatement(odbcChannel,"ALTER TABLE Table_Name 
          ALTER COLUMN Batch_Name Nvarchar(50)") 

私は、ターゲット表にデータを挿入することができます。しかし、これは特に、データベース内のすべての列が異なる型を持つ場合は、かなり複雑に思えます。私はこの問題の解決策を見つけた

敬具と感謝、

HP

答えて

0

私はフィールドタイプと長さを定義することができますよりも、次のコードを使用している場合:

sql.field.types <- list(Batch_Name = "nvarchar(50)") 

dbWriteTable(odbcChannel, "Table_Name", upload.data, append = TRUE, overwrite = FALSE, 
           row.names=FALSE, encoding = "latin1", field.types = sql.field.types) 

を長いデータテーブル内の列のいずれのコンテンツがある場合、これはまだ私のエラーメッセージを生成しますデータベースに定義されています。

ただし、データテーブルのデータをRで調整して、データベースの要件を満たすことをお勧めします。したがって、常に定義された再現可能なプロセスがあります。

よろしく、

HP

関連する問題