Как обновить одну таблицу из другой без указания имен столбцов? - PullRequest
8 голосов
/ 08 октября 2010

У меня есть две таблицы с одинаковой структурой и ОЧЕНЬ БОЛЬШИМ количеством полей (около 1000). Мне нужно выполнить 2 операции 1) Вставьте из второй таблицы все строки в кулак. Пример:

INSERT INTO [1607348182]
SELECT * 
FROM _tmp_1607348182;

2) Обновление первой таблицы из второй таблицы но для обновления я не могу найти правильный синтаксис sql для обновления.

Запросы типа:

Update [1607348182]
set [1607348182].* = tmp.*
from [1607348182]
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid

или

Update [1607348182]
from [1607348182]
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid

недействительно.

Ответы [ 2 ]

5 голосов
/ 08 октября 2010

Будет ли работать удаление всего из основной таблицы с идентификатором в temp, а затем выполнить вставку с новыми данными?

3 голосов
/ 08 октября 2010

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

Этот оператор будет возвращать список столбцов, основанный на имени таблицы, в которую вы положили:

select name from syscolumns
where [id] = (select [id] from sysobjects where name = 'tablename')

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

set @query = 'update [1607348182] set '
load cursor --(we will use @name to hold the column name)
while stillrecordsincursor
set @query = @query + @name + ' = tmp_[1607348182]. ' +@name + ','
load next value from cursor
loop!

Когда запрос завершен, будучи встроенным в цикл, используйте exec sp_executesql @ query.

Просто небольшое предупреждение ... создание динамического sql в цикле, подобном этомуможет стать немного запутанным.Для устранения неполадок, поместите select @query в цикл и посмотрите, как создается @query.

edit: Не уверен, что вы сможете сделать все 1000 строк в обновлении одновременно ... тамлогические ограничения (varchar (8000)?) на размер, который может расти @query.Возможно, вам придется разделить код, чтобы он обрабатывал 50 столбцов одновременно.Поместите столбцы из оператора выбора syscolumns во временную таблицу с идентификатором и создайте динамический sql, чтобы он обновлял 20 столбцов (или 50?) За раз.

Другой альтернативой может быть использование Excel для массовой сборкиэтот.Выберите столбец и скопируйте результаты в столбец таблицы.Поместите '= в столбце b, tmp. [12331312]в столбце c скопируйте столбец a в столбец D и запятую в столбец e.Скопируйте всю электронную таблицу в блокнот, и у вас должны быть созданы столбцы оператора обновления.Неплохое решение, если это событие с одним выстрелом, не уверенный, если бы я полагался на это как на постоянное решение.

...