2013-01-15 16 views
17

मैं एक एसक्यूएल सर्वर तालिका में एक dataframe अपलोड करने के लिए कोशिश कर रहा हूँ, मैं इसे तोड़ने की कोशिश की एक सरल एसक्यूएल क्वेरी स्ट्रिंग के लिए नीचे ..कैसे एक एसक्यूएल सर्वर तालिका में एक dataframe सम्मिलित करने के लिए?

library(RODBC) 
con <- odbcDriverConnect("driver=SQL Server; server=database") 

df <- data.frame(a=1:10, b=10:1, c=11:20) 

values <- paste("(",df$a,",", df$b,",",df$c,")", sep="", collapse=",") 

cmd <- paste("insert into MyTable values ", values) 

result <- sqlQuery(con, cmd, as.is=TRUE) 

..which काम करने के लिए लगता है, लेकिन बहुत अच्छी तरह से बड़े पैमाने नहीं है। क्या कोई आसान तरीका है?

+1

यदि तालिका मौजूद है तो "संलग्न करें" को सत्य होने की आवश्यकता है, या sqlUpdate का उपयोग करें। यदि यह अस्तित्व में नहीं है तो मैं sqlSave में डिफ़ॉल्ट (FALSE) के साथ अटक गया होता। मैंने पढ़ा है कि SQL सर्वर के लिए अजीब नामकरण सम्मेलन हैं लेकिन मेरे पास एक प्रतिलिपि नहीं है जो परीक्षण करने में असमर्थ है। –

उत्तर

18

[संपादित] शायद चिपकाने names(df) स्केलिंग समस्या का समाधान होगा:

values <- paste(" df[ , c(", 
        paste(names(df),collapse=",") , 
            ")] ", collapse="") 
     values 
     #[1] " df[ , c(a,b,c)] " 

आप कहते हैं कि अपने कोड है "काम" .. मैं भी सोचा है एक sqlSave का प्रयोग करेंगे बल्कि sqlQuery से अगर एक चाहते थे होगा "अपलोड करें"।

मैं अनुमान लगाया है कि इस अधिक आप क्या वर्णित करने की संभावना होगा:

sqlSave(con, df, tablename = "MyTable") 
+0

सुनिश्चित नहीं हैं कि आप 'values' चर के साथ क्या करने की कोशिश कर रहे हैं, कि सिर्फ एक अजीब लग बनाता स्ट्रिंग ?! आप पिछली कॉमा के बारे में सही हैं, यह एक समस्या होगी। "अतिरिक्त उद्धरण" मेरे मूल कोड से छोड़े गए हैं। – jenswirf

+0

कि सिर्फ उदहारण देते हैं कि 'नाम (DF)' और "[" आप क्या कर रहे थे की तुलना में अधिक संक्षेप में स्तंभों के आधार पर एक data.frame उपयोग करने के लिए इस्तेमाल किया जा सकता था। इसे 'पतन = "" 'या' पतन =", "प्रभावी होने की आवश्यकता होगी। –

5

insert INTO के बाद से 1000 पंक्तियाँ, आप कर सकते हैं dbBulkCopyrsqlserver से पैकेज तक सीमित है।

dbBulkCopy एक डीबीआई एक्सटेंशन है जो माइक्रोसॉफ्ट एसक्यूएल सर्वर लोकप्रिय कमांड लाइन उपयोगिता को bcp नामित करता है ताकि बड़ी फ़ाइलों को तालिका में त्वरित रूप से कॉपी किया जा सके। उदाहरण के लिए:

url = "Server=localhost;Database=TEST_RSQLSERVER;Trusted_Connection=True;" 
conn <- dbConnect('SqlServer',url=url) 
## I assume the table already exist 
dbBulkCopy(conn,name='T_BULKCOPY',value=df,overwrite=TRUE) 
dbDisconnect(conn) 
+0

मैं dbBulkCopy काम करने के लिए नहीं मिल सकता है ... ऐसा लगता है कि इस ... clrCallStatic ("rsqlserver.net.misc", में त्रुटि एक अजीब त्रुटि पैदा करता है ... और ... प्रकार है: System.Data.SqlClient.SqlException ... मैं भी बनाने के लिए पता नहीं है अगर यह dbBulkCopy त्रुटि या rClr पैकेज त्रुटि है ... आप किसी भी विचार आया कि यह क्या हो सकता है? –

+0

@ MihaTrošt आप 'rsqlserver'' के अन्य कार्यों के साथ काम करने के लिए प्रबंधित करते है? बेहतर [rsqlserver मुद्दा] (/ मुद्दों) में एक मुद्दा है, मैं बारीकी से इस पर गौर करेंगे। – agstudy

+1

मैं अन्य कार्यों है और यह भी, इस विषय निम्नलिखित के साथ काम कर सकते हैं http://stackoverflow.com/questions/19190744/how-to-quickly- निर्यात डेटा-से-आर-टू-एसक्यूएल सर्वर, मुझे लगता है कि यह dbBulkCopy मुद्दा नहीं है ... पहले, मैं थोक डालने अनुमति नहीं थी (मैं अब है), दूसरा, फ़ाइल मैं dbBulkCopy करने की कोशिश की नहीं थी मशीन पर जहां SQL सर्वर स्थापित है और इसे नहीं मिला। इसलिए ... अभी के लिए, कृपया मेरी टिप्पणियों को कभी भी ध्यान न दें और अपने समय के लिए धन्यवाद। –

0

यह मेरे लिए काम करता है और मुझे यह आसान लगता है।

library(sqldf) 
library(odbc) 
con <- dbConnect(odbc(), 
       Driver = "SQL Server", 
       Server = "ServerName", 
       Database = "DBName", 
       UID = "UserName", 
       PWD = "Password") 
dbWriteTable(conn = con, 
      name = "TableName", 
      value = x) ## x is any data frame 
+0

dbWriteTable RODBC की तुलना में बहुत तेजी से होता है :: sqlSave – mateskabe

संबंधित मुद्दे