DDL-скрипт SQL Server для добавления (или удаления) одинакового набора столбцов для каждой таблицы в базе данных? - PullRequest
3 голосов
/ 24 февраля 2010

Как написать сценарий DDL сервера SQL, который может:

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010
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 TABLE_NAME=@TableName AND COLUMN_NAME='CreatedBy')
            EXECUTE ('ALTER TABLE [' + @TableName + '] ADD CreatedBy VARCHAR(50)')

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

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

        IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@TableName 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 голосов
/ 02 ноября 2010

Отличный образец, 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 TABLE_NAME=@TableName 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
...