2013-04-08 15 views
6

chciałbym uruchomić „alter table” na ALL Tabele w moim SQL databse:ALTER wszystkie tabele w bazie danych

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

wiem jak dostać się wszystkich istniejących tabel z bazy danych:

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

lub

USE DATABASE_NAME 
GO 
SELECT name 
FROM sys.Tables 
GO 

Ale nie wiem, jak połączyć te dwa.

W mojej bazie danych (tabele 50+) wszystkie tabele mają wspólny 1 wiersz. i chciałbym ustawić domyślną wartość dla wszystkich tych wierszy.

Odpowiedz

1

Jeśli jest to proces jednorazowy, który nie musi być zautomatyzowany następnie prawdopodobnie można zrobić gorzej niż działa coś jak poniżej i po prostu kopiowanie/wklejanie wyjścia:

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

można spróbować wygenerować polecenie i wykonać je po. Możesz zrobić coś takiego:

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

I wykonać pobieranie.

+0

dziękuję :) to pokazało być zaakceptowaną odpowiedzią :) – user889030

0

Jesli chcesz użyć 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

ustawić 'COLUMN NAME' i wykonać, to dodać domyślne ograniczenie do setted kolumnie.

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

Moim preferowanym sposobem jest napisanie SP dla tego. Mam niektóre z tych narzędzi SP w moich bazach danych i zmieniam je w razie potrzeby, aby zaktualizować rzeczy. Oto przykład, który zmienia sortowanie. Widać, że modyfikując instrukcję SET @S = ..., możesz wykonać dowolną zmianę tabeli.

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; 
Powiązane problemy