У нас есть AS400 с использованием DB2, и мне нужно скопировать данные клиента в новое место для анализа, но его нужно очистить, чтобы защитить конфиденциальную информацию. Я делаю это с 30-40 столами. ХП становится большим ...DB2 SQL Scubbing Data в выписке с динамическими столбцами
Во всяком случае, для краткого примера, скажем, данные выглядят немного как это для колонн, а во 2-й строке, результат копируемых данных:
Col1 | Col2 | Name | Sex | SS# | Age | Col7 | Col8 |
______________________________________________________________________________________________
* | * | Case when Sex = F, | * | 111111111 | * | * | * |
| then Jane Doe else |
| John Smith end |
Мои первая попытка это сделать массивную вставку, а затем обновить, что-то вроде:
Insert into New_Table (Select * from Old_Table) ;
Update New_Table
set Name = (Case when Sex = ‘F’ then ‘Jane Doe’ else ‘John Smith’ End),
SS# = 111111111 ;
проблема заключается в том, что на миллион строк, 200 столбцов и триггеры на таблицах, оператор вставки быстро, но обновление мучительно медленное - как в часах. Поэтому с помощью Stack я попробовал следующее:
Insert into New_Table (Select Col1, Col2,
(Case when Sex = ‘F’ then ‘Jane Doe’ else ‘John Smith’ End),
Sex, 111111111, Age, Col7, Col8)
Работал как чемпион - спасибо команде Stack !!
Теперь у меня есть еще одна проблема. У меня есть разработчики с неприятной привычкой добавлять столбцы к этим таблицам, и я не в их команде. Эти таблицы имеют 200 столбцов, и когда я сталкиваюсь с ошибкой, изменения могут быть интересными, когда мне нужно найти новые столбцы.
Итак, я пытаюсь создать способ для создания инструкции SQL на лету и выполните его, чтобы столбцы были гибкими. Конечно, это добавит еще одну секунду к заявлению, чтобы построить его, но по сравнению с часами труда, когда происходит ошибка, это того стоит.
Я думал о том, чтобы использовать что-то вроде поиска в столбце, а затем подставлять только те столбцы, которые я хочу, создавая инструкцию SQL, а затем Exec для ее вызова. Я просто не могу придумать, как это сделать. Что касается построения инструкции, это может занять немного времени по сравнению с временем выполнения запросов. Например, я могу тянуть колонки с:
Select COLUMN_NAME from Sysibm.columns where tbname = 'old_table' AND table_schema = ‘MySchema’.
Может быть, я могу положить, что в переменную, то поиск столбцов я знаю (имя, сс #) и заменить их, а затем построить заявление SQL и EXEC оно ? Результат оператора select для столбцов (см. Выше), хотя и не подходит для списка с разделителями-запятыми, как мне нужно. Насколько я могу судить.
Мысли кто-нибудь?
Спасибо, заранее.
Два списка - интересная идея. И петля через э? Я попробую. Кроме того, это интересная идея о том, чтобы полностью перечислить столбцы, которые я обновляю, а затем разрешать значения по умолчанию. Неплохо. Не думал об этом из-за 200 столбцов, но имеет смысл использовать значения по умолчанию. Я буду работать над всем этим и посмотреть, смогу ли я это сделать. Благодаря!! –
Да, это боль, чтобы перечислить 200 столбцов. Но для производственного кода это лучшая практика. На самом деле не так сложно скопировать и вставить список столбцов, находящихся в настоящее время в таблице. Достойный текстовый редактор позволяет добавить нужную запятую. – Charles
Эй, вы знаете, есть ли удар производительности для инструкции insert, если поля не все в порядке? На миллион строк и 250 столбцов это «может» иметь значение, но, возможно, нет? Может быть, SQL ставит все в порядке? –