Изменить столбец, добавить ограничение по умолчанию - PullRequest
177 голосов
/ 19 января 2010

У меня есть таблица, и один из столбцов - это «Дата» типа datetime. Мы решили добавить ограничение по умолчанию для этого столбца

Alter table TableName
alter column dbo.TableName.Date default getutcdate() 

но это дает мне ошибку:

Неверный синтаксис рядом с '.'

Кто-нибудь видит здесь что-то явно не то, чего мне не хватает (кроме лучшего названия для столбца)

Ответы [ 6 ]

329 голосов
/ 19 января 2010

Попробуйте это

alter table TableName 
 add constraint df_ConstraintNAme 
 default getutcdate() for [Date]

пример

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

также убедитесь, что вы называете ограничение по умолчанию. Это будет боль в шее, чтобы отбросить его позже, потому что оноодно из этих сумасшедших имен, сгенерированных системой ... см. также Как назвать ограничения по умолчанию и Как удалить ограничение по умолчанию без имени в SQL Server

7 голосов
/ 09 апреля 2014

Я использую хранимую процедуру ниже, чтобы обновить значения по умолчанию для столбца.

Он автоматически удаляет все предыдущие значения по умолчанию в столбце перед добавлением нового значения по умолчанию.

Примеры использования:

-- 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''';

Хранимая процедура:

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

Ошибки, которые устраняет эта хранимая процедура

Если вы попытаетесь добавить столбец по умолчанию, когда он уже существует, вы получите следующую ошибку (что вы никогда не увидите, если используете этот сохраненный процесс):

-- 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.
7 голосов
/ 19 января 2010

Вы можете заключить зарезервированные слова в квадратные скобки, чтобы избежать следующих ошибок:

dbo.TableName.[Date]
5 голосов
/ 28 января 2014

На самом деле вы должны сделать как ниже пример, который поможет решить проблему ...

drop table ABC_table

create table ABC_table
(
    names varchar(20),
    age int
)

ALTER TABLE ABC_table
ADD CONSTRAINT MyConstraintName
DEFAULT 'This is not NULL' FOR names

insert into ABC(age) values(10)

select * from ABC
0 голосов
/ 22 июня 2019

изменить таблицу TableName удалить ограничение DF_TableName_WhenEntered

изменить таблицу TableName добавить ограничение DF_TableName_WhenEntered по умолчанию getutcdate () для WhenEntered

0 голосов
/ 14 сентября 2018

Вы указываете имя таблицы дважды. Часть ALTER TABLE называет таблицу. Пытаться: Изменить таблицу TableName изменить столбец [Дата] по умолчанию getutcdate ()

...