2010-07-19 74 views
1

我需要改变模式中的多个表,对于一些前缀的所有表,例如:到多个表添加列模式

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

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

回答

0

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

OP本来没有指定DB2。我的答案因此是多余的。

+0

如果你在这里提供了一个总结性的解释,它可以帮助你获得更多的信息,如果提问者需要的话。当SO接管世界并且是Google首个“sp_MSforeachTable”结果时,点击该链接的人将会对此回答感到非常恼火 – 2010-07-19 02:24:08

+0

这是否在DB2中可用?我忘了提及这是数据库类型。 – 2010-07-19 02:27:09

+0

OP没有指定它是DB2,这使得我的答案变得冗余。 – 2010-07-19 04:10:46

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:基本上,这需要某种形式的动态SQL。 'INFORMATION_SCHEMA.TABLES'(sp?)是ANSI标准,支持SQL Server,Oracle和MySQL,以简化这些事情。就我个人而言,我更喜欢DDL脚本中的硬编码语句 - 当有需要查看的情况下,如果存在未记录的表格,更容易找到事物。 – 2010-07-19 02:32:50

1

感谢大家的输入,

创造什么后(我认为)使用光标看中程序和while循环通过表迭代,我决定,因为它是一个曾经关闭,以建立各的ALTER查询从SELECT语句因此表:

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

下面将列添加到所有的表与特定数据库中的特定模式(例如,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