2

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

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

4 回答 4

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类型格式,您需要适应您使用的任何脚本工具。

于 2010-07-19T02:28:13.113 回答
1

谢谢大家的意见,

在使用 CURSOR 和 while 循环创建了(我认为的)花哨的过程来遍历表之后,我决定因为从 select 语句中为每个表构建一个 ALTER 查询是一次性的,因此:

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

于 2010-07-20T02:40:42.020 回答
0

使用未记录的sp_MSforeachTable. 你会在谷歌上找到很多帮助。

OP 最初没有指定 DB2。因此,我的回答是多余的。

于 2010-07-19T02:22:04.787 回答
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
于 2017-10-13T03:37:00.670 回答