2013-04-08 22 views
6

Vorrei eseguire un "Alter tabella" a ALL le tabelle nel mio SQL databse:Alter tutte le tabelle nel database

ALTER TABLE test ADD CONSTRAINT [COLLUM_NAME] DEFAULT ((0)) FOR [COLLUM_NAME] 

So come ottenere tutte le tabelle esistenti dal database:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 

o

USE DATABASE_NAME 
GO 
SELECT name 
FROM sys.Tables 
GO 

Ma io non so come combinare questi due.

Nel mio database (oltre 50 tabelle) tutte le tabelle hanno 1 riga in comune. e vorrei impostare un valore predefinito per tutte queste righe.

risposta

1

Se questo è un processo una tantum che non ha bisogno di essere automatizzato allora probabilmente si potrebbe fare di peggio che correre qualcosa di simile a quanto segue e basta copiare/incollare l'output:

select 'alter table ' + t.name + ' add constraint ' + c.name + ' default ((0)) for ' + c.name 
from sysobjects t join syscolumns c on c.id = t.id 
where t.xtype = 'U' 
7

Si può provare per generare un comando ed eseguirlo dopo. Si può fare qualcosa di simile:

SELECT CONCAT("Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` this is my default value change on the column") as MySQLCMD 
FROM TABLES 

ed eseguire il recupero.

+0

grazie :) questo ha mostrato essere accettato risposta :) – user889030

0

Se u vuole usare INFORMATION_SCHEMA

SELECT 'ALTER TABLE ' +t.TABLE_NAME+ ' ADD CONSTRAINT ' 
+c.COLUMN_NAME +' DEFAULT ((0)) FOR '+c.COLUMN_NAME 
FROM INFORMATION_SCHEMA.TABLES t 
INNER JOIN INFORMATION_SCHEMA.COLUMNS c on t.TABLE_NAME=c.TABLE_NAME 
WHERE TABLE_TYPE = 'BASE TABLE' 
0

impostare il 'COLUMN NAME' ed eseguire, si aggiungerà un vincolo predefinito di colonna impostato.

DECLARE @sql NVARCHAR(MAX) ; 
DECLARE @LINEBREAK AS VARCHAR(2) 
SET @LINEBREAK = CHAR(13) + CHAR(10)  

SELECT @sql = COALESCE(@sql + ';' + @LINEBREAK, '') + 'ALTER TABLE ' 
     + QUOTENAME([TABLES].TABLE_NAME) + ' ADD CONSTRAINT ' + QUOTENAME([COLUMNS].COLUMN_NAME) 
     + ' DEFAULT ((0)) FOR ' + QUOTENAME([COLUMNS].COLUMN_NAME) 
FROM INFORMATION_SCHEMA.TABLES [TABLES] 
     INNER JOIN INFORMATION_SCHEMA.COLUMNS AS [COLUMNS] ON [TABLES].TABLE_NAME = [COLUMNS].TABLE_NAME 
WHERE TABLE_TYPE = 'BASE TABLE' 
     AND [COLUMNS].[COLUMN_NAME] = 'COLUMN NAME' 
PRINT @sql 
EXEC sp_executesql @sql 
0

Il mio modo preferito è scrivere un SP per questo. Ho alcuni di questi SP di utilità nei miei database e li modifico come necessario per aggiornare le cose. Ecco un esempio che modifica le regole di confronto. Puoi vedere che modificando l'istruzione SET @S = ... puoi fare qualsiasi modifica alla tabella che ti piace.

DECLARE table_name VARCHAR(255); 
DCLARE end_of_tables INT DEFAULT 0; 
DECLARE num_tables INT DEFAULT 0; 

DECLARE cur CURSOR FOR 
    SELECT t.table_name 
    FROM information_schema.tables t 
    WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE'; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_of_tables = 1; 

OPEN cur; 

tables_loop: LOOP 

    FETCH cur INTO table_name; 

    IF end_of_tables = 1 THEN 
     LEAVE tables_loop; 
    END IF; 

    SET num_tables = num_tables + 1; 

    SET @s = CONCAT('ALTER TABLE ' , table_name , ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci'); 

    PREPARE stmt FROM @s; 
    EXECUTE stmt; 
END LOOP; 

CLOSE cur; 
Problemi correlati