2008-10-18 2 views
2

Существует две базы данных, в базе данных A есть таблица A с столбцами идентификатора, группы и флага. База данных B имеет таблицу B со столбцами идентификатора и флага. Таблица B представляет собой, по существу, подмножество таблицы A where the group == 'B'.Согласование столбца на двух таблицах в SQL Server

Они обновлены/созданы нечеткими способами, которые находятся за пределами моего понимания в настоящее время, и выходят за рамки этого вопроса (сейчас не время исправить основные настройки и действия этого клиента).

Проблема в том, что при обновлении флага в таблице А оно не отражается в таблице B, но должно быть. Это не критическая задача, поэтому было предложено создать задание для этого. Может быть, потому, что это конец недели или, может быть, потому, что я никогда не писал больше, чем самая основная хранимая процедура (я программист, а не администратор базы данных), но я не уверен, как это сделать.

На упрощенном уровне, хранимая процедура будет что-то вдоль линий в

Select * in table A where group == B 

Затем цикл через resultset, и для каждого идентификатора, обновить флаг.

Но я даже не уверен, как это сделать в stored procedure вот так. Предложения? Пример кода будет предпочтительным.

Усложнение: Хорошо, это становится еще сложнее. Для каждой группы таблица B находится в отдельной базе данных, и нам необходимо обновить этот флаг для всех групп. Таким образом, мы должны были бы создать отдельный триггер для каждой группы для обработки каждого имени БД.

И да, вставки в таблицу B уже обработаны - это просто обновление статуса флага.

+0

Похоже, что у вас есть аналогичный вопрос по адресу http://stackoverflow.com/questions/149132/how-can-one-iterate-over-stored-procedure-results-from-within-another-stored-pr, но он останавливается на шаг, который я хочу выполнить. – 2008-10-18 02:41:47

+0

Я просто перечитал связанный вопрос; как бы вы описали следующий шаг, который не хватает для вашей ситуации? Вы спрашиваете, как использовать курсоры (которые не были разрешены в связанном вопросе)? Какова масштаб этой проблемы, т. Е. Сколько строк в таблице А? – Matt 2008-10-18 04:02:31

ответ

0

Создать триггер обновления в таблице A, который подталкивает необходимые изменения к B при изменении A.

В принципе (синтаксис может быть неправильным, я не могу проверить его прямо сейчас). Кажется, я помню, что вставленная таблица содержит все обновленные строки в обновлении, но вы можете проверить это, чтобы убедиться. Я думаю, что триггер - это путь.

create trigger update_b_trigger 
on Table_A 
for update 
as 
begin 
    update Table_B 
    set Table_B.flag = inserted.flag 
    from inserted 
      inner join Table_B 
      on inserted.id = Table_B.id 
       and inserted.group = 'B' 
       and inserted.flag <> Table_B.flag 
end 

[EDIT] Я предполагаю, что вставки/удаления в таблице B уже обрабатываются и это просто флаг обновления таблицы B, которые должны быть решены.

2

Предполагая, что идентификатор является уникальным ключом и вы можете использовать связанные серверы или некоторые из них для запуска запроса на серверах, этот SQL-оператор должен работать (он работает для двух таблиц на одном сервере).

UPDATE Table_B 
SET Table_B.Flag = Table_A.Flag 
FROM Table_A inner join Table_B on Table_A.id = Table_B.id 

(поскольку TABLE_B уже содержит подмножество строк из TABLE_A, где группа = B, мы не должны включить это условие в нашем запросе)

Если вы не можете использовать связанные серверы, а затем Я могу попытаться сделать это с помощью своего рода пакета SSIS. Или я бы использовал метод, описанный в linked question (comments, above), чтобы получить соответствующие данные из базы данных A в таблицу temp и т. Д. В базе данных B, а затем запустить этот запрос, используя временную таблицу.

2
UPDATE 
    DatabaseB.dbo.Table_B 
SET 
    DatabaseB.dbo.Table_B.[Flag] = DatabaseA.dbo.Table_A.Flag 
FROM 
    DatabaseA.dbo.Table_A inner join DatabaseB.dbo.Table_B B 
    on DatabaseA.dbo.id = DatabaseB.dbo.B.id 

Усложнение: Для sevaral групп запустить одно такое обновление SQL для каждой группы.

Примечание. Вы можете использовать флаг без []. Я использую скобки только из-за синтаксической раскраски в stackoverflow.

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