2010-10-08 3 views
8

У меня есть две таблицы с одинаковой структурой и ОЧЕНЬ БОЛЬШОЕ количество полей (около 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 

являются недействительными.

+3

Я бы рекомендовал использовать «TRIGGER» или изменить вашу схему, чтобы вам не пришлось это делать. –

+0

Я не понимаю. После вашего первого обновления две таблицы будут содержать одинаковые строки, так что вы надеетесь, что второе обновление будет делать? – PaulG

+0

Travis G, я согласен с вами в изменении схемы db, но, к сожалению, я должен следовать этой схеме в моем проекте. – amuliar

ответ

3

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

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

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

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

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

Когда запрос делается строится в цикле, используйте EXEC sp_executesql @query.

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

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

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

+0

Кажется, это лучшие решения, потому что в sql нет встроенного выражения в sql. Также у меня были проблемы с другими ограничениями SQL Server, связанными с столбцами с переменным размером.(Также я понимаю, что мои проблемы исходят из плохой схемы БД) Итак, ваше решение кажется лучшим, потому что я могу кэшировать этот оператор SQL и повторно использовать его позже в других запросах. – amuliar

+0

О varchar (8000) ограничение. Я могу создать varchar (MAX) в любом случае – amuliar

+0

Хорошо, я недавно работал в старых базах данных и забыл о varchar (max). Что касается плохой схемы db ... Я предполагаю, что вы работаете со старой схемой (редко видите таблицы с именами за пределами flatfiles/IDBMS). Ночной импорт из старой системы в нормализованную базу данных может быть хорошим вариантом для рассмотрения, в противном случае вы смотрите на относительно большое количество времени, затраченного на работу с этой плохой схемой, которая будет добавлена ​​к каждому проекту, который вы делаете. – Twelfth

5

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

+0

Да, я понял это решение и внедрил его. Спасибо – amuliar

Смежные вопросы