SQL Server 未插入r Dataframe 中的sql更新数据

km0tfn4u  于 2022-11-21  发布在  其他
关注(0)|答案(3)|浏览(142)

我有一个包含三列(a、B、c)的 Dataframe (df)
我使用以下命令将这些值插入SQL数据库

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)

来源:How to insert a dataframe into a SQL Server table?
我的问题是这个例子的update等价物是什么?

cmd <- paste("update MyTable values ", values)
result <- sqlQuery(con, cmd, as.is=TRUE)

我尝试了sqlSave和sqlUpdate,但是它很快就出现了错误消息,比如缺少列、索引等......所以我回到上面的例子,尝试学习如何使用基于玩具数据集的更新语句。非常感谢各位的帮助。

yfjy0ee7

yfjy0ee71#

首先,UPDATE的语法是错误的。

UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

所以你不能像你所做的那样把值构建成一个连接的向量。如果你没有选择一个带有WHERE的特定元素,你将在column1中的所有值上更新value1的值。
EDIT:如果你不能匹配条件,那么你实际上不是在更新,而是在插入,其形式如下:
INSERT INTO语句可以用两种形式编写。
第一种形式不指定要插入数据的列名,只指定列名的值:

INSERT INTO table_name
VALUES (value1,value2,value3,...);

第二种形式指定要插入的列名和值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

如果你想做一些更复杂的事情,你需要用SQL来构建查询,可能首先要用R以外的语言,至少要学习一下。如果你还不习惯使用SQL,可以尝试一下SQL fiddle

zsohkypk

zsohkypk2#

我知道这个问题是张贴超过4年前,但我希望这将有助于其他用户谁正在寻找这个答案。

table <- [NAME OF THE TABLE YOU WANT TO UPDATE]
x <- [YOUR DATA SET]

# We'll need the column names of the table for our INSERT/UPDATE statement
rs <- dbSendQuery(con, paste0('SHOW COLUMNS FROM ', table, ';'))
col_names <- dbFetch(rs)
dbClearResult(rs)

# Find which columns are primary keys as we shouldn't need to update these
pri <- which(col_names$Key == "PRI")

# For each row in your data frame, build an UPDATE statement and query your db
for(i in 1:nrow(x)) {

    # Transform ith row of dataset into character vector
    values <- sapply(x[i, ], as.character)

    # Build the INSERT/UPDATE query
    myquery <- paste0("INSERT INTO ",
                      table,
                      "(", paste(col_names$Field, collapse = ", "), ") ", # column names   
                      "VALUES",
                      "('", paste(values, collapse = "', '"), "') ", # new records
                      "ON DUPLICATE KEY UPDATE ",
                      paste(col_names$Field[-pri], values[-pri], sep = " = '", collapse = "', "), # everything minus primary keys
                      "';")

    # Show full query for clarity
    cat("Performing query", i, "of", nrow(x), ":\n", myquery, "\n\n")

    # Send query to database
    dbSendQuery(con, myquery)

}

我刚刚在GitHub上发布了这个问题的解决方案,如果您正在寻找一个更有指导性的演练。

mnemlml8

mnemlml83#

我知道这个帖子已经有好几年了,但是如果有人现在偶然发现这个,我想我应该写一个更好的答案。OP试图使用的方法是非常痛苦和低效的。你可以简单地使用dbWriteTable命令。你可以直接将数据从 Dataframe 插入到一个以前不存在的新表中,或者你可以通过设置append = TRUE选项来追加一个现有的表。请参阅help(dbWriteTable)了解其他选项,以及指定列数据类型。注意,在下面的示例中,我定义了SQL Server名称和数据库名称,但出于明显的安全原因,我没有在此处显示它们的值。我包含了命令和相应的输出。

> #Connect to Azure SQL Server database
> con <- DBI::dbConnect(odbc::odbc(), 
+                       Driver = "ODBC Driver 17 for SQL Server", 
+                       Server = SQL_SERVER_NAME,
+                       Database = SQL_DATABASE_NAME,
+                       Authentication = "ActiveDirectoryIntegrated")
> 
> 
> # Setup example, create two dataframes
> # df1:  dataframe to insert into new SQL table that doesn't exist yet
> # df2:  dataframe for appending
> df1 <- data.frame(a=1:10, b=10:1, c=11:20)
> df2 <- data.frame(a=31:30, b=30:31, c=41:50)
> 
> # dbWriteTable sends your df1 dataframe to SQL Server and builds the table
> DBI::dbWriteTable(conn = con, 
+                   name = "my_table_in_sql_server", 
+                   value = df1
+                   )
> 
> # If the table already exists, you can append it using the append = TRUE argument
> DBI::dbWriteTable(conn = con, 
+                   name = "my_table_in_sql_server", 
+                   value = df2, 
+                   append = TRUE
+ )
> 
> # You can verify your data was inserted now by simply querying the table 
> DBI::dbGetQuery(conn = con, statement = "select * from my_table_in_sql_server")
    a  b  c
1   1 10 11
2   2  9 12
3   3  8 13
4   4  7 14
5   5  6 15
6   6  5 16
7   7  4 17
8   8  3 18
9   9  2 19
10 10  1 20
11 31 30 41
12 30 31 42
13 31 30 43
14 30 31 44
15 31 30 45
16 30 31 46
17 31 30 47
18 30 31 48
19 31 30 49
20 30 31 50

相关问题