Есть две базы данных, в базе данных A есть таблица A со столбцами id, group и flag. В базе данных B есть таблица B со столбцами идентификаторов и флагов. Таблица B по существу является подмножеством таблицы A where the group == 'B'.
Они обновляются / создаются странными способами, которые находятся вне моего понимания в настоящее время и выходят за рамки этого вопроса (сейчас не время исправлять базовые настройки и методы этого клиента).
Проблема в том, что когда флаг в таблице A обновляется, он не отражается в таблице B, но должен быть. Это не критичная по времени проблема, поэтому мне было предложено создать задание для ее решения. Может быть, потому что это конец недели, или, может быть, потому, что я никогда не писал больше, чем самая простая хранимая процедура (я программист, а не администратор базы данных), но я не уверен, как это сделать.
На упрощенном уровне хранимая процедура будет чем-то вроде
Select * in table A where group == B
Затем прокрутите resultset и обновите флаг для каждого идентификатора.
Но я даже не знаю, как вот так зациклить stored procedure. Предложения? Пример кода был бы предпочтительнее.
Осложнение: Хорошо, это тоже становится немного сложнее. Для каждой группы таблица B находится в отдельной базе данных, и нам нужно обновить этот флаг для всех групп. Таким образом, нам пришлось бы настроить отдельный триггер для каждой группы для обработки каждого имени БД.
И да, вставки в Таблицу B уже обработаны - это просто для обновления статуса флага.
Я просто перечитал связанный вопрос; как бы вы описали следующий шаг, которого не хватает в вашей ситуации? Вы спрашиваете, как использовать курсоры (которые не разрешены в связанном вопросе)? Каков масштаб этой проблемы, т.е. сколько строк в таблице A?
В настоящее время 2 млн. Я ожидал, что это будет ежегодное количество добавляемых строк.
Что касается следующего шага, возможно, я просто слишком много обдумываю. Ваш ответ может помочь. Узнаю завтра, когда проснется админ сервера.
Это по неизвестным мне причинам больше не рассматривается, поэтому я не могу сказать, какой ответ был лучшим, поскольку он никогда не был реализован. Извиняюсь.


Создайте триггер обновления для таблицы 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
[РЕДАКТИРОВАТЬ] Я предполагаю, что операции вставки / удаления в Таблицу B уже выполнены, и это всего лишь отметка об обновлениях Таблицы B, которые необходимо решить.
Хорошо, похоже, это сработает для любых новых обновлений, но базы данных сейчас не синхронизированы. Кроме того, создаст ли создание 20-30 триггеров (по одному для каждой группы / БД) проблемы с производительностью?
Предполагая, что идентификатор является уникальным ключом и что вы можете использовать связанные серверы или что-то подобное для выполнения запроса между серверами, этот оператор 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, где group = B, нам не нужно включать это условие в наш запрос)
Если вы не можете использовать связанные серверы, я могу попробовать сделать это с помощью какого-нибудь пакета SSIS. Или я бы использовал метод, описанный в связанный вопрос (комментарии, выше), чтобы получить соответствующие данные из базы данных A во временную таблицу и т. д. В базе данных B, а затем выполнить этот запрос с использованием временной таблицы.
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
Осложнение: Для нескольких групп запустите один такой SQL-запрос обновления для каждой группы.
Обратите внимание, что вы можете использовать Flag без []. Я использую скобки только из-за раскраски синтаксиса в stackoverflow.
Похоже, что есть аналогичный вопрос на stackoverflow.com/questions/149132/…, но он останавливается на шаг впереди того, что я хочу выполнить.