Фильтрация наборов репликации для топ-2
У меня есть набор репликации, который мы используем в репликации слиянием (SQL 2005). Я пытаюсь выяснить, как применить фильтр Top 2 к таблице.
Кроме того, есть ли способ настроить фильтр так, чтобы он сводился к подстолбам, или мне нужно было бы обрабатывать это по-другому?
Я смотрю на базу данных планов, которую я копирую на ноутбуки наших пользователей. Я хотел бы только реплицировать последние два плана и реплицировать только связанные данные для этих двух планов. Например, есть таблица лекарств, в которой перечислены все лекарства, связанные с определенным планом. Я бы хотел копировать только те строки таблицы лекарств, которые связаны с одним из двух топ-планов.
Я не уверен, как я должен идти об этом. Я вижу опцию "Фильтр" в свойствах публикации, но она указана в таблице, и у меня, похоже, нет опции "Топ 2".
1 ответ
Фильтрация может быть выполнена только через предложение WHERE. То, что вам нужно было бы вставить в фильтр, это что-то вроде этого.
WHERE PlanId IN (SELECT TOP (2) PlanId FROM Plan ORDER BY CreateDate DESC)
Если вы поместите это в фильтр для каждой таблицы, он будет реплицировать только строки для этих двух планов.
Чтобы использовать несколько столбцов для фильтра, что-то вроде этого "должно" работать. Я не проверял это, поэтому может потребоваться некоторая настройка, чтобы это произошло.
WHERE PlanId IN (
SELECT PlanId FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY ClientId, PlanId ORDER BY CreateDate DESC) RowId,
PlanId, ClientId
FROM [Plan] a
where [Plan].PlanId = a.PlanId
and [Plan].ClientId = a.ClientID
) b
WHERE b.RowId IN (1,2)
)