Согласование столбца между двумя таблицами в SQL Server - PullRequest
2 голосов
/ 18 октября 2008

Существует две базы данных, база данных A имеет таблицу A со столбцами id, group и flag. База данных B имеет таблицу B со столбцами ID и флага. Таблица B по существу является подмножеством таблицы A where the group == 'B'.

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

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

На упрощенном уровне хранимая процедура будет выглядеть примерно так:

Select * in table A where group == B

Затем выполните цикл по resultset и обновите флаг для каждого идентификатора.

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

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

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

Ответы [ 4 ]

2 голосов
/ 19 октября 2008
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 для каждой группы.

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

2 голосов
/ 18 октября 2008

Предполагая, что ID является уникальным ключом, и что вы можете использовать связанные серверы или что-то подобное для выполнения запроса на разных серверах, этот оператор 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, а затем выполнить этот запрос с использованием временной таблицы .

0 голосов
/ 18 октября 2008

Создайте триггер обновления в таблице 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, которые должны быть адресованы.

0 голосов
/ 18 октября 2008

Похоже, что аналогичный вопрос на Как можно перебрать результаты хранимой процедуры из другой хранимой процедуры ... без курсоров? , но это останавливает шаг на шаг ниже того, что я ищу достигнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...