将列添加到架构中的多个表

时间:2010-07-19 02:19:58

标签: sql db2 alter

对于所有以前缀为前缀的表,我需要更改模式中的多个表,例如:

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个表。

我想知道我是否可以使用某种通配符?我正在考虑从System表创建一个游标,但确定必须有一个更简单的方法。

4 个答案:

答案 0 :(得分:3)

在这些情况下,如果DBMS没有提供简单的方法,我倾向于做的就是简单地编写一个脚本来为我做。类似的东西:

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 :(得分:1)

感谢大家的投入,

在使用CURSOR和while循环创建了什么(我认为)花哨的过程来迭代表之后,我决定从一个select语句为每个表构建一个ALTER查询,因此:< / p>

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个表。我猜有时最不优雅的解决方案就足够了: - )

答案 2 :(得分:0)

使用未记录的sp_MSforeachTable。你会在Google找到很多帮助。

OP最初没有指定DB2。我的答案是多余的。

答案 3 :(得分:0)

以下内容将为特定数据库(例如MyDatabase)中具有特定架构(例如,MySchema)的所有表添加一列

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