2010-07-19 78 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