Добавить столбцы в несколько таблиц в схеме - PullRequest
2 голосов
/ 19 июля 2010

Мне нужно изменить несколько таблиц в схеме, для всех таблиц с префиксом, например:

ALTER TABLE "SCHEMA"."TABLE1"
ADD ( "COLUMN1"   CHARACTER(4)  NOT NULL    DEFAULT 'DATA',
    "COLUMN2"   VARCHAR(16)     NOT NULL    DEFAULT 'MORE_DATA',
);

Мне нужно это для итерации по нескольким таблицам, таким как SCHEMA.table1, SCHEMA.table2 ... и так далее. В схеме около 800 таблиц.

Мне было интересно, есть ли какой-нибудь подстановочный знак, который я мог бы использовать? Я смотрел на создание курсора из системных таблиц, но был уверен, что должен быть более простой способ.

Ответы [ 4 ]

3 голосов
/ 19 июля 2010

Что я обычно делаю в тех случаях, если СУБД не предоставляет простой способ сделать это, это просто написать скрипт, который сделает это за меня. Что-то вроде:

db2 "select tbname from sysibm.systables where schema = 'SCHEMA'" >tblist
# Edit tblist here to remove headers and such.
for t in $(cat tblist) ; do
    db2 "alter table SCHEMA.${t} add ..."
done

Это bash форматный тип, вам нужно будет адаптировать его к любому используемому вами скриптовому инструменту.

1 голос
/ 20 июля 2010

Спасибо всем за участие,

После создания необычной (с моей точки зрения) процедуры с использованием CURSOR и цикла while для итерации по таблицам, я решил, что это единожды - создать запрос ALTER для каждой таблицы из оператора select следующим образом: 1003 *

SELECT DISTINCT 'ALTER TABLE '
          || 'CTP0610'
          || '.'
          || name
          || ' ADD COLUMN SOURCE_SYSTEM_CODE CHAR(4) NOT NULL DEFAULT ''CCR'' '
          || ' ADD COLUMN RECORD_TYPE VARCHAR(16) NOT NULL DEFAULT ''INSERT'' '
          || ' ADD COLUMN COMMIT_TIMESTAMP TIMESTAMP NOT NULL DEFAULT '
          || ' ADD COLUMN EXTRACT_TIMESTAMP TIMESTAMP NOT NULL DEFAULT; '
    FROM sysibm.systables
    WHERE (NAME LIKE 'CCTL_%')
    OR (NAME LIKE 'CCX_%')
    OR (NAME LIKE 'CC_%');

Я вставил результирующие запросы в окно запроса и запустил его, оказалось, что это около 1500 таблиц. Я думаю, что иногда наименее элегантное решение достаточно хорошо: -)

0 голосов
/ 13 октября 2017

Следующее добавит столбец ко всем таблицам с определенной схемой (например, MySchema) в конкретной базе данных (например, MyDatabase)

declare @tablename nvarchar(max)
declare @sqlstring nvarchar(max)
declare cur cursor for 
select 
    [TABLE_SCHEMA] + '.' + [TABLE_NAME] from MyDatabase.INFORMATION_SCHEMA.Tables 
where 
    [TABLE_SCHEMA] = 'MySchema'

open cur
    fetch next from cur into @tablename
    while @@fetch_status=0
    begin
        set @sqlstring = 'ALTER TABLE ' + @tablename + ' ADD MyColumn DateTime NOT NULL'

        exec sp_executesql @sqlstring

        fetch next from cur into @tablename
    end

close cur
deallocate cur
0 голосов
/ 19 июля 2010

Используйте недокументированное sp_MSforeachTable.Для этого вы найдете множество справок в Google .

OP изначально не определял DB2.Мой ответ, таким образом, излишен.

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