Alter column, add default constraint

后端 未结 6 2090
臣服心动
臣服心动 2020-12-07 16:21

I have a table and one of the columns is \"Date\" of type datetime. We decided to add a default constraint to that column

Alter table TableName
alter column         


        
6条回答
  •  有刺的猬
    2020-12-07 16:53

    I use the stored procedure below to update the defaults on a column.

    It automatically removes any prior defaults on the column, before adding the new default.

    Examples of usage:

    -- Update default to be a date.
    exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','getdate()';
    -- Update default to be a number.
    exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column,'6';
    -- Update default to be a string. Note extra quotes, as this is not a function.
    exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','''MyString''';
    

    Stored procedure:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- Sample function calls:
    --exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','ColumnName','getdate()';
    --exec [dbol].[AlterDefaultForColumn] '[dbo].[TableName]','Column,'6';
    --exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','''MyString''';
    create PROCEDURE [dbo].[ColumnDefaultUpdate]
        (
            -- Table name, including schema, e.g. '[dbo].[TableName]'
            @TABLE_NAME VARCHAR(100), 
            -- Column name, e.g. 'ColumnName'.
            @COLUMN_NAME VARCHAR(100),
            -- New default, e.g. '''MyDefault''' or 'getdate()'
            -- Note that if you want to set it to a string constant, the contents
            -- must be surrounded by extra quotes, e.g. '''MyConstant''' not 'MyConstant'
            @NEW_DEFAULT VARCHAR(100)
        )
    AS 
    BEGIN       
        -- Trim angle brackets so things work even if they are included.
        set @COLUMN_NAME = REPLACE(@COLUMN_NAME, '[', '')
        set @COLUMN_NAME = REPLACE(@COLUMN_NAME, ']', '')
    
        print 'Table name: ' + @TABLE_NAME;
        print 'Column name: ' + @COLUMN_NAME;
        DECLARE @ObjectName NVARCHAR(100)
        SELECT @ObjectName = OBJECT_NAME([default_object_id]) FROM SYS.COLUMNS
        WHERE [object_id] = OBJECT_ID(@TABLE_NAME) AND [name] = @COLUMN_NAME;
    
        IF @ObjectName <> '' 
        begin
            print 'Removed default: ' + @ObjectName;
            --print('ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @ObjectName)
            EXEC('ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @ObjectName)
        end
    
        EXEC('ALTER TABLE ' + @TABLE_NAME + ' ADD  DEFAULT (' + @NEW_DEFAULT + ') FOR ' + @COLUMN_NAME)
        --print('ALTER TABLE ' + @TABLE_NAME + ' ADD  DEFAULT (' + @NEW_DEFAULT + ') FOR ' + @COLUMN_NAME)
        print 'Added default of: ' + @NEW_DEFAULT;
    END
    

    Errors this stored procedure eliminates

    If you attempt to add a default to a column when one already exists, you will get the following error (something you will never see if using this stored proc):

    -- Using the stored procedure eliminates this error:
    Msg 1781, Level 16, State 1, Line 1
    Column already has a DEFAULT bound to it.
    Msg 1750, Level 16, State 0, Line 1
    Could not create constraint. See previous errors.
    

提交回复
热议问题