5

短い要約

パッケージを使用して、R data.frame から SQLServer データベースのテーブルにデータを挿入しようとしていDBIます。sqlAppendTable に関する情報を読んだ後、この関数が必要な SQL ステートメントの生成に役立つことを期待していました。ただし、この関数は文字変数の前後に文字列を配置しないようで、実行しようとするとエラーが発生します。私はそれを正しく使用していますか?この目的のためにこの関数を使用する必要がありますか? そうでない場合は、別のアプローチをお勧めできますか?

私のコード

library(odbc)
library(DBI)

con <- dbConnect(
    odbc::odbc(),
    dsn      = myDsn,
    UID      = myLogin,
    PWD      = myPwd,
    Port     = 1433,
    encoding = "latin1"
  )

insertStatement <- sqlAppendTable(
    con,
    "DBtable",
    myDataFrame,
    row.names = FALSE
  )

dbExecute(
  con,
  insertStatement
)

dbDisconnect(con)

データベース テーブル「DBtable」には 3 つの列があり、それぞれの型はvarcharです。data.frame "myDataFrame" にもcharacter、同じ名前で同じ順序の型の 3 つの列があります。

問題

sqlAppendTable文字変数が引用符で囲まれていない SQL ステートメント、つまり次の形式の出力を生成します。

<SQL> INSERT INTO "DBtable"
  ("col1", "col2", "col3")
VALUES
  (Value one one, Value one two, Value one three),
  (Value two one, Value two two, Value two three),
  etc.

この出力をdbExecuteステートメントで使用すると、値が引用符で囲まれていないため、エラーが発生しValue one one, ...ます'Value one one', ...

私の質問

  • この関数を取得して文字変数を引用符で囲む方法はありますか? もしそうなら、どのように?
  • この機能をこの目的で使用できますか? (情報は、それが何を意味するにせよ、「主にバックエンドの実装者に役立つ」と述べています。)
  • できない場合、使用できる別の機能はありますか? paste(または同様の関数)を使用してカスタムメイドのステートメントを作成することは避けたいと思います。これは、面倒でエラーが発生しやすく、異なるテーブルに簡単に複製できないためです。
4

2 に答える 2

2

私は同じ問題を抱えていましたが、入力として data.frame を取り、その中のすべての値を引用する小さなヘルパー関数を作成しました:

sQuote.df <- function(df) {
    for (c in 1:ncol(df)) df[,c] <- sQuote(gsub("'", "`", df[,c]))
    df
}

(ここでの gsub 関数は、data.frame 内の潜在的な一重引用符を後方アポストロフィに変更するために使用したことに注意してください)

これを sqlAppendTable のように使用する

sqlAppendTable(connection, "table", sQuote.df(df_to_insert), row.names=F)

この機能は私にとって非常に便利で便利なものになりました。

于 2019-04-07T08:06:35.273 に答える