2017-09-07 3 views
1

Beim Versuch, ein Update mit einer SQL-Anweisung mit der sqlquery Funktion in RODBC zu laufen, bringt es einen FehlerWie führe ich eine SQL Update-Anweisung in RODBC?

„[RODBC] ERROR up. Könnte nicht SQLExecDirect‘

Wie Sie eine direkte Aktualisierung durchführen ? Anweisung mit R

+0

Ich würde empfehlen, die 'odbc' Paket (basierend auf der DBI-Spezifikation), die sogar Masseneinfügungen und Updates unterstützt (wo' RODBC' ist sehr langsam) siehe https://stackoverflow.com/a/43642590/4468078 –

Antwort

1

Sie nicht eine einfache SQL-Update-Anweisung mit der SQL-Abfrage-Funktion verwenden kann, es muss nur ein Resultset zurückgeben zum Beispiel wird die folgende Anweisung nicht:.

sql="update mytable set column=value where column=value" 
cn <-odbcDriverConnect(connection="yourconnectionstring") 
resultset <- sqlQuery(cn,sql) 

Aber wenn y Wenn Sie eine Ausgabeanweisung hinzufügen, funktioniert die SQL-Abfragefunktion problemlos. Beispielsweise.

Ich habe gerade eine Funktion hinzugefügt, um es einfach zu machen, Ihre rohe SQL und schnell in eine Update-Anweisung zu verwandeln.

setUpdateSql <-function(updatesql, wheresql, output="inserted.*"){ 
    sql=paste(updatesql," output ",output, wheresql) 
    sql=gsub("\n"," ",sql) #remove new lines if they appear in sql 
    return(sql) 

} 

Also jetzt muss ich nur die SQL-Anweisung aufteilen und es wird ausgeführt. Ich könnte auch einen "insert.columnname" hinzufügen, wenn ich das Ganze nicht zurückgeben wollte.

sql=setUpdateSql("update mytable set column=value","where column=value","inserted.column")#last parameter is optional 
cn <-odbcDriverConnect(connection="yourconnectionstring") 
resultset <- sqlQuery(cn,sql) 

Der andere Vorteil dieser Methode ist, dass Sie herausfinden können, was in der Ergebnismenge verändert hat.

+0

THX, rette mich viel Zeit, um das Problem zu lösen. Ich verwende normalerweise gespeicherte Prozeduren, um Daten zu aktualisieren, und SPs können über 'EXEC' in' sqlQuery' aufgerufen werden. Eine Alternative wäre das neue DBI-basierte Paket 'odbc' (ohne" R "im Namen!). –