Общий SQL-запрос для архивирования нескольких таблиц - PullRequest
1 голос
/ 02 сентября 2011

Как мы можем управлять процессом архивирования без написания отдельных хранимых процедур в SQL Server 2000?

Например,

  • Есть две таблицы в текущем db-студент и сотрудник.
  • Цель - архивировать данные в этих таблицах-

  • student таблица - данные старше 1 года

  • employee таблица - данные старше 2 лет

Поле даты для сравнения в таблице студента - это поле CreatedDate и поле сотрудника. это DOJ

Кроме того, я сохранил таблицу конфигурации со столбцами ConfigtableName, ConfigColumnName , ConfigCutoffdate.

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

Примерно так ...

INSERT INTO <ArchiveDb>.Dbo.<Table name obtained from config table>
    SELECT *
FROM <CurrentDb>.Dbo.<Table name obtained from config table>
WHERE   
       <ConfigColumnName  obtained from config table> < <Cutoffdate obtained from config table>

б) Как управлять опцией определения набора полей?

в) Возможно ли, если в n-й итерации произойдет ошибка, это может сохранить подробности ошибки в журнал?

1 Ответ

0 голосов
/ 02 сентября 2011

Единственный способ создать такой динамический запрос в хранимой процедуре - использовать хранимую процедуру sp_executesql . Прочитайте документацию, на которую я ссылался. Довольно прямолинейно.

Я не уверен, что понимаю, что вы подразумеваете под "опцией набора идентификаторов", но если вас беспокоит дублирование значений в столбце, который должен иметь уникальные значения (PK), я бы порекомендовал вам отключить уникальные индексы в архивные таблицы, так как они предназначены для архивирования. Я не предполагаю, что возникнет серьезная проблема с дублирующимися значениями в столбце id, но самое главное, что такая ситуация никогда не должна возникать, если таблицы архивации являются идентичными копиями исходных таблиц.

Если вы хотите отлавливать ошибки в n-й итерации, вам придется заключать каждую итерацию в блок начального транса / коммит транса и проверять наличие ошибок. Если есть, вы можете войти в любую другую таблицу по вашему выбору; если нет, то вы совершаете транзакцию. Прочтите это для примера (прокрутите полностью до раздела Транзакции).

...