对于所有以前缀为前缀的表,我需要更改模式中的多个表,例如:
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表创建一个游标,但确定必须有一个更简单的方法。
答案 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