3

次のことができるSQLサーバーDDLスクリプトをどのように記述しますか。

データベース内の各テーブルについて:

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

また、特定の列がテーブルに既に存在する場合は、その列をスキップしてください。

また、逆に、テーブルごとに、これらの 4 つの列を削除します。

4

2 に答える 2

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 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 EXISTSIF EXISTS、ALTER ステートメントをALTER TABLE...DROP [ColumnName]

于 2010-02-24T19:58:21.387 に答える
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 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
于 2010-11-02T00:57:04.193 に答える