Add a column if it doesn't exist to all tables?

前端 未结 4 1247
忘了有多久
忘了有多久 2021-02-05 01:30

I\'m using SQL Server 2005/2008. I need to add a column to a table if it does not yet exist. This will apply to all tables in a given database. I hoped I was close, but I\'m h

相关标签:
4条回答
  • 2021-02-05 02:19

    Maybe like this:

    EXEC sp_MSforeachtable '
        declare @tblname varchar(255);
        SET @tblname =  PARSENAME("?",1);
    
        if not exists (select column_name from INFORMATION_SCHEMA.columns 
                       where table_name = @tblname and column_name = ''CreatedOn'') 
        begin
            ALTER TABLE [?] ADD CreatedOn datetime NOT NULL DEFAULT getdate();
        end
    '
    

    ?

    Or even like this:

    EXEC sp_MSforeachtable '
        if not exists (select column_name from INFORMATION_SCHEMA.columns 
                       where table_name = ''?'' and column_name = ''CreatedOn'') 
        begin
            ALTER TABLE [?] ADD CreatedOn datetime NOT NULL DEFAULT getdate();
        end
    '
    
    0 讨论(0)
  • 2021-02-05 02:26

    DECLARE @Column VARCHAR(100) = 'Inserted_date'
    DECLARE @sql VARCHAR(max) = NULL
    
    SELECT @sql += ' ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + 'ADD' + @Column + 'datetime NOT NULL DEFAULT getdate()' + '; '
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE'
        AND TABLE_NAME IN (
            SELECT DISTINCT NAME
            FROM SYS.TABLES
            WHERE type = 'U'
                AND Object_id IN (
                    SELECT DISTINCT Object_id
                    FROM SYS.COLUMNS
                    WHERE NAME != @Column
                    )
            )
    EXEC Sp_executesql @sql
    
    0 讨论(0)
  • 2021-02-05 02:30

    You'll need to mix in a bit of dynamic SQL. This should work:

    EXEC sp_MSforeachtable '
        declare @tblname varchar(255);
        SET @tblname =  PARSENAME("?",1);
        declare @sql nvarchar(1000);
    
        if not exists (select column_name from INFORMATION_SCHEMA.columns 
                       where table_name = @tblname and column_name = ''CreatedOn'') 
        begin
            set @sql = N''ALTER TABLE '' +  @tblname + N'' ADD CreatedOn datetime NOT NULL DEFAULT getdate();''
            exec sp_executesql @sql
        end
    '
    
    0 讨论(0)
  • 2021-02-05 02:33

    You cannot use variables, like @tableName, in DDL. Besides, splinting the name into part and ignoring the schema can only result in bugs. You should just use the ''?'' replacement in the SQL batch parameter and rely on the MSforeachtable replacement:

    EXEC sp_MSforeachtable '
    if not exists (select * from sys.columns 
                   where object_id = object_id(''?'')
                   and name = ''CreatedOn'') 
    begin
        ALTER TABLE ? ADD CreatedOn datetime NOT NULL DEFAULT getdate();
    end';
    
    0 讨论(0)
提交回复
热议问题