Как лучше всего проверить и преобразовать каждую ячейку в таблице сервера SQL при копировании ее в другую базу данных? - PullRequest
1 голос
/ 30 июня 2011

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

У меня есть таблица, содержащая метаданные с атрибутами, которые указывают на каждую ячейку, и список неверных значений, которые должны быть удалены из исходных таблиц.

Например, у меня есть следующая таблица

TABLE1
ColumnA | ColumnB | ColumnC |
   7    |   10     |   DK     |
   83   |   -7     |          |
   16   |   0      |   True   |

Тогда в таблице метаданных есть

Tablename | Column |  Bad Value 1 | Bad Value 2 |
  TABLE1  |ColumnC |      DK      |    BOL      |
  TABLE1  |ColumnA |      -99     |    -1       |
  TABLE1  |ColumnB |      -1      |     -7      |

В скопированной и преобразованной таблице TABLE1 у меня будет

TABLE1
ColumnA | ColumnB | ColumnC |
   7    |   10     |   NULL   |
   83   |   NULL   |          |
   16   |   0      |   True   |

Я хочу понять, что будет лучшим способом сделать это.Я рассмотрел написание функции, которая вызывается для каждой ячейки.Будет передана метаинформация, необходимая для поиска ячейки в таблице метаданных «плохих значений», и текущее значение ячейки, а затем вернет значение ячейки или NULL, в зависимости от того, соответствует ли ячейка какой-либо из соответствующихплохие ценности.

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

Мне нужно будет повторять процесс периодически (еженедельно).

Буду очень признателен за любые советы, которые вы можете дать.

Том

1 Ответ

0 голосов
/ 01 июля 2011

Для этого вам нужно написать курсор и использовать динамический SQL.Я не думаю, что вы найдете здесь кого-нибудь, кто закодирует все для вас, но вот несколько моментов для рассмотрения.

  • Создайте «мастер» таблицу, в которой есть все вашитаблицы для копирования.Я предполагаю, что будет возможно иметь таблицу, которая не нуждается в замене в какой-то момент.Это позволит вам легко изменить процесс.Предлагаемая структура будет выглядеть примерно так: Database, Schema, Table, Active, с битом Active, который можно переключать.

  • Используя динамический SQL, создайте оператор INSERT для каждой таблицы.Получите ваши "плохие" значения из таблицы, чтобы заполнить CASE для этих полей.Итак, что-то вроде CASE WHEN ColumnC = 'DK' OR ColumnC = 'BOL' THEN NULL ELSE ColumnC as ColumnC.Это обновит значение «в пути», поэтому вы не измените свою существующую БД, но у вашей цели есть желаемые изменения.

  • Вам потребуется либо запись для каждого столбца взатронутые таблицы, иметь отдельную «основную» таблицу для ваших столбцов на таблицу или запросить системные таблицы, чтобы получить список полей для копирования.Вы не можете просто сделать SELECT *, если вам нужно сделать оператор CASE.

...