2013-04-08 3 views
6

Я хотел бы запустить «Alter Table» на ВСЕХ таблиц в моей SQL Databse: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

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 в моих базах данных, и я изменяю их по мере необходимости для обновления. Вот пример, который меняет сортировку. Вы можете видеть, что, изменяя инструкцию 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; 
Смежные вопросы