2010-02-24 2 views
3

Как бы один написать SQL-сервер DDL скрипт, который можно:SQL Server DDL-скрипт для добавления (или удаления) одного и того же набора столбцов для каждой таблицы в базе данных?

Для каждой таблицы в базе данных:

add column CreatedBy 
add column CreateDate 
add column UpdatedBy 
add column UpdatedDate 

Кроме того, если конкретный столбец уже существует на столе, просто пропустить этот столбец.

Кроме того, в обратном порядке для каждой таблицы отбрасывайте эти 4 столбца.

ответ

2
DECLARE @TableName NVARCHAR(128) 

DECLARE curTables CURSOR FAST_FORWARD FOR 
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 

OPEN curTables 

FETCH NEXT FROM curTables INTO @TableName 

WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE [email protected] AND COLUMN_NAME='CreatedBy') 
      EXECUTE ('ALTER TABLE [' + @TableName + '] ADD CreatedBy VARCHAR(50)') 

     IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE [email protected] AND COLUMN_NAME='CreatedDate') 
      EXECUTE ('ALTER TABLE [' + @TableName + '] ADD CreatedDate DATETIME') 

     IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE [email protected] AND COLUMN_NAME='UpdatedBy') 
      EXECUTE ('ALTER TABLE [' + @TableName + '] ADD UpdatedBy VARCHAR(50)') 

     IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE [email protected] AND COLUMN_NAME='UpdatedDate') 
      EXECUTE ('ALTER TABLE [' + @TableName + '] ADD UpdatedDate DATETIME') 


     FETCH NEXT FROM curTables INTO @TableName 
    END 

CLOSE curTables 
DEALLOCATE curTables 

Тогда обратное только случай изменения IF NOT EXISTS к IF EXISTS и операторы ALTER для ALTER TABLE...DROP [ColumnName]

+0

Brilliant! Огромное спасибо..... – tbone

0

Великий образца, AdaTheDev! Однако я сделал небольшое изменение, чтобы игнорировать таблицы в различных схемах, представлениях и таблицах членства aspnet. Вы можете легко изменить его, если хотите просто обрабатывать таблицы в определенных схемах.

Вот моя версия:

DECLARE @TableName NVARCHAR(128) 
DECLARE @TableSchema NVARCHAR(128) 

DECLARE curTables CURSOR FAST_FORWARD FOR 
select TABLE_SCHEMA, TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE' and (TABLE_SCHEMA not in ('schems1', 'schems2') and TABLE_NAME not like 'aspnet_%') 
OPEN curTables 

FETCH NEXT FROM curTables INTO @TableSchema, @TableName 

WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE [email protected] AND COLUMN_NAME='Locked') 
      EXECUTE ('ALTER TABLE [' + @TableSchema + '].[' + @TableName + '] ADD Locked bit NOT NULL CONSTRAINT DF_' + @TableSchema + '_' + @TableName + '_Locked DEFAULT 0') 

     FETCH NEXT FROM curTables INTO @TableSchema, @TableName 
    END 

CLOSE curTables 
DEALLOCATE curTables 
Смежные вопросы