Я пытаюсь вставить ежедневно импортируемые данные в таблицу 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 как (автоматически) добавлять столбцы в родительскую таблицу, когда это необходимо?Спасибо!