Problem:
如何將 R 資料寫入至 SQL Server 資料庫
Analysis:
針對 SQL Server 資料庫可採用 RODBC 套件, 其中 sqlQuery 指令可執行資料匯入至R與將R物件寫入SQL資料庫.
步驟 1
先在 ODBC 管理員中新增 SQL Server ODBC 資料來源, 考慮連結名稱是 「R_SQL2008」.
步驟 2
考慮某 Northwind 資料庫, 其中包括 Orders 資料表, 如下圖所示.
步驟 3
先執行 library(RODBC), 再利用 odbcConnect 連結至SQL Server ODBC 資料來源, 最後配合 sqlQuery 與 SQL 指令將資料匯入至R. 依 class 結果可知為資料框架物件(data.frame). 利用 table 指令可計算各運送國家的個數. 平均數 mean 亦可加以使用.
步驟 4
考慮 Shippers 資料表有3筆記錄.
步驟 5
利用 names 指令可了解資料表欄位名稱
步驟 6
在 sqlQuery 中配合 INSERT INTO 指令可將R資料寫入SQL 資料庫, 其中第一個欄位(ShipperID)為自動編號主索引鍵, 因此該欄位不用加在 INSERT INTO 指令中, 最後再次讀取資料已新增為4筆.
步驟 7
新增資料 INSERT 語法如下:
完整R code:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# title: Connect R to Mircosoft SQL server | |
# date: 2013/8/11 | |
# author: Ming-Chang | |
library(RODBC) | |
channel <- odbcConnect("R_SQL2008", uid="rwepa", pwd="rwepa") | |
df <- sqlQuery(channel, "SELECT * FROM Orders") | |
class(df) | |
names(df) | |
head(df,n=3) | |
table(df$ShipCountry) | |
mean(df$Freight) | |
# write data to Microsoft Server | |
# count the total = 3 | |
df <- sqlQuery(channel, "SELECT * FROM Shippers") | |
df | |
dim(df)[1] | |
names(df) | |
# one can try sqlSave | |
# use sqlQuery with INSERT to add new data (no.4) | |
# Colum with Primary key(auto increase) is omitted from SQL command | |
insert.sql <- paste("INSERT INTO Shippers", "(CompanyName, Phone) ", "VALUES", "(", "'WEPA',", "'7654321'", ")") | |
sqlQuery(channel, insert.sql) | |
df <- sqlQuery(channel, "SELECT * FROM Shippers") | |
df # total count = 4 | |
# close connection | |
odbcClose(channel) | |
# end |
# end
謝謝 R user- Chang 提供此問題.
想請問一下,insert至sql的部份,只能一次一筆嗎?若是一整個R的data.frame想insert到sql中的表格,有建議的方法嗎?謝謝
回覆刪除我也有同樣的問題,不知道你有找到解答了嗎?
刪除RODBC似乎沒有批次寫入的功能,
刪除之前為了批次寫入,所以改用mariaDB,
RMySQL可以用dbWriteTable。
後來老闆要我改回Oracle,又回到RODBC這個坑,
有找到ORDBCDBI這個package裡面也有dbWriteTable這個函數,
但是還沒測試成功~
自己把dataframe用apply包成insert query instring
刪除再一次送
要注意以下幾點
1. 資料型別對應
2. 科學計號表示
3. 空值NA->NULL
4. 一個insert query string有限制長度,一般來說不得超過1000個Row
我有空再把之前寫的code包一包丟到github上
改用ROracle吧~~~~~
回覆刪除