Как вставить данные в таблицу так, чтобы возможные дополнительные столбцы в данных были добавлены в родительскую таблицу? - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь вставить ежедневно импортируемые данные в таблицу SQL Server (2017).Хотя в большинстве случаев импортируемые данные имеют фиксированное количество столбцов, иногда клиент хочет добавить новый столбец к импортируемым данным.

Я ищу решение, которое, когдаданные импортируются (будь то из другой таблицы, из R или из .csv, не обращайте на это внимания), SQL автоматически добавит отсутствующий (дополнительный) столбец в родительскую таблицу, предоставив имя столбца и присвоив NULL всем предыдущимзаписей.

Я пробовал и с UNION ALL, и с BULK INSERT, но оба они требуют одинакового количества столбцов.Я работаю с SSMS2017, R3.4.1.

Далее я попытался с помощью промежуточной таблицы и изменил предложение UNION следующим образом:

SELECT * FROM Table_new
UNION ALL
SELECT Tp.*, '' FROM Table_parent Tp;

Но чаще всего дополнительный столбец неЭто не происходит, поэтому проблема измерения столбца возникает снова.

Я также думал о запуске запросов из R с DBI и odbc dbWriteTable () и обработке недопустимой ошибки столбца с помощью TryCatch (), анализируя имя столбца изсообщение об ошибке и так далее, но это было бы самое шаткое ремесло, которое я когда-либо делал и предпочел бы не делать.

В конечном итоге я подумал о добавлении предложения if в R и, в зависимости от количества добавленных новых столбцов, зациклился и добавил часть "," "в запрос SQL для создания дополнительных столбцов.Я убежден, что это слишком сложное решение этой проблемы.

# Pseudo-R

#calculate the difference between lenght(colnames)
diff <- diff(length(colnames_new, colnames_parent)

if diff = 0 {
    dbQuery(BULK INSERT INTO old SELECT * FROM new;)
} else if diff > 0 {
    dbQuery(paste0(SELECT * FROM new
    UNION ALL
    SELECT T1.*, loop_paste(, '' /* for every diff */), FROM parent T1;))
} else if diff < 0 {
    dbQuery(SELECT * FROM parent
    UNION ALL
    SELECT T2.*, loop_paste(, '' /* for every diff */), FROM new T2;))
}

Подводя итог: при вставке данных в таблицу SQL как (автоматически) добавлять столбцы в родительскую таблицу, когда это необходимо?Спасибо!

1 Ответ

0 голосов
/ 17 мая 2019

Вещи в вашей базе данных, такие как таблицы, столбцы, первичные ключи, внешние ключи, пункты проверки, являются частью базы данных схема . Люди проектируют схему перед добавлением данных в базу данных.

Если вы хотите добавить новые столбцы, вам нужно изменить схему. Когда вы сделаете это, вам также придется переписать некоторые процедуры CRUD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...