2010-07-19 43 views
1

je dois modifier plusieurs tables dans un schéma, pour toutes les tables préfixées avec quelque chose, par exemple:Ajouter des colonnes à plusieurs tables dans le schéma

ALTER TABLE "SCHEMA"."TABLE1" 
ADD ("COLUMN1" CHARACTER(4) NOT NULL DEFAULT 'DATA', 
    "COLUMN2" VARCHAR(16)  NOT NULL DEFAULT 'MORE_DATA', 
); 

Je en ai besoin pour itérer sur plusieurs tables, comme SCHEMA.table1 , SCHEMA.table2 ... et ainsi de suite. Il y a environ 800 tables dans le schéma. Je me demandais s'il y avait une sorte de joker que je pouvais utiliser? Je cherchais à créer un curseur à partir des tables système, mais j'étais sûr qu'il devait y avoir un moyen plus facile.

Répondre

0

Utilisez le document non documenté sp_MSforeachTable. Vous trouverez beaucoup d'aide sur Google pour cela.

OP n'a pas spécifié DB2 à l'origine. Ma réponse est donc redondante.

+0

Cela aide si vous incluez une explication sommaire ici, avec un lien vers plus d'informations si le demandeur en a besoin. Lorsque SO a pris le contrôle du monde et est le premier résultat de Google pour "sp_MSforeachTable", la personne qui clique sur le lien va être très ennuyé par cette réponse. –

+0

Est-ce disponible dans DB2? J'ai oublié de mentionner que c'est le type de base de données. –

+0

OP n'a pas spécifié qu'il s'agissait de DB2, ce qui rend ma réponse redondante. –

3

Ce que j'ai tendance à faire dans ces cas, si le SGBD ne fournit pas un moyen facile de le faire, est simplement d'écrire un script qui va le faire pour moi. Quelque chose comme:

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 

C'est bash format de type, vous devrez adapter pour tout outil de script que vous utilisez.

+1

+1: Fondamentalement, cela nécessite une forme de SQL dynamique. 'INFORMATION_SCHEMA.TABLES' (sp?) Est un standard ANSI, pris en charge sur SQL Server, Oracle et MySQL pour simplifier ces choses. Personnellement, je préfère les instructions codées en dur dans les scripts DDL - plus faciles à trouver lorsque vous avez besoin de revoir au cas où il y aurait une table non documentée. –

1

Merci pour les commentaires de chacun,

Après avoir créé ce qui était (je pensais) procédure de fantaisie en utilisant un curseur et en boucle pour itérer à travers les tables, j'ai décidé, car il est une fois de bâtir une requête ALTER pour chaque des tables d'une instruction select ainsi:

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_%'); 

Je collais les requêtes résultantes dans une fenêtre de requête et a couru, il est avéré être autour de 1500 tables. Je suppose que parfois la solution la moins élégante est assez bon :-)

0

Ce qui suit ajouter une colonne à toutes les tables avec un schéma spécifique (par exemple, MySchema) dans une base de données spécifique (par exemple, MaBase)

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