2013-04-08 58 views
6

所有的表,我想對ALL在我的SQL DATABSE表運行「ALTER TABLE」:Alter在數據庫

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

我知道如何讓所有從數據庫中現有的表:

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

USE DATABASE_NAME 
GO 
SELECT name 
FROM sys.Tables 
GO 

但我不知道如何將這兩個結合起來。

在我的數據庫(50+表格)中,所有表格都有1行共同。 我想爲所有這些行設置一個默認值。

回答

1

如果這是一個一次性的過程,它不需要那麼自動化你也許可以做的比運行像下面的惡化,只是複製/粘貼輸出:

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

你可以試試生成一個命令然後執行它。 你可以做這樣的事情:

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

並執行檢索。

+0

謝謝:)這表明被接受回答:) – user889030 2017-03-19 10:11:29

0

如果妳想要使用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

設置'COLUMN NAME'和執行,這將添加默認約束設置好的列。

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

我的首選方法是爲此編寫一個SP。我在我的數據庫中有一些這樣的實用程序SP,並根據需要更改它們以更新內容。以下是更改排序規則的示例。你可以看到,通過修改SET @S = ...語句,你可以做任何你喜歡的表更改。

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; 
相關問題