R - Обновление данных на SQL Server с помощью RODBC - PullRequest
0 голосов
/ 11 сентября 2018

Я запускаю скрипт в R, а затем мне нужно отправить его результаты на SQL Server.

Во время первого запуска я использовал этот код:

sqlSave(conn, df, tablename = "myschema.result_table", rownames=FALSE,
        append=FALSE, varTypes=varTypes)

Таким образом, таблица быласоздал и все работало нормально.Теперь я хотел бы обновить результаты следующим образом:

  1. , если Id существует в result_table, обновить содержимое.
  2. , если Id не существуетв result_table, добавьте строку с этим Id.

Проблема в том, что если я использую:

sqlUpdate(conn, df, tablename = "myschema.result_table", index = "Id", fast = FALSE)

Я получаю ошибку, как только скрипт находитId не существует в result_table.При использовании sqlSave с append=TRUE все добавляется без дальнейших проверок, и я получаю двойные строки.

Есть ли какое-либо решение этой проблемы или мне нужно каждый раз создавать новую таблицу результатов, а затем объединятьэти таблицы в SQL?

1 Ответ

0 голосов
/ 11 сентября 2018

Есть несколько простых способов справиться с этим:

1) Перенесите ваши существующие идентификаторы в R, извлеките существующие идентификаторы из вашего окончательного фрейма данных, вставьте и обновите на основе двух фреймов данных. Вот пример того, как обновить таблицу с фреймом данных в R:

Как обновить строки в базе данных значениями из data.frame в R условно

2) Сбросить все результаты в таблицу в SQL, затем запустить хранимую процедуру, которая обновляет данные для существующих идентификаторов, вставляет данные для несуществующих идентификаторов, а затем очищает указанную таблицу.

UPDATE t
SET t.Col1 = r.Col1
FROM table t 
    JOIN tablefromr r --Existing
        ON t.ID = r.ID

INSERT INTO table
SELECT r.*
FROM tablefromr r
    LEFT JOIN table t
        ON r.ID = t.ID
WHERE t.ID IS NULL --Not Existing

TRUNCATE TABLE tablefromr

3) Сохраните ваши результаты во временную таблицу в SQL (глобальную, чтобы вы могли получить доступ в R) - затем выполните те же шаги, что и # 2.

Не уверен, является ли это разовым или чем-то, чем вы будете заниматься постоянно. Правильный ответ зависит от этого. Надеюсь, я помог!

...