Изменить столбец, добавить ограничение по умолчанию

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

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

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

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

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

7 ответов

Решение

Попробуй это

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

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

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

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

dbo.TableName.[Date]

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

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

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

-- 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.

Я подтверждаю, как комментарий от JohnH, никогда не используйте типы столбцов в именах ваших объектов! Это сбивает с толку. И по возможности используйте скобки.

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

      ALTER TABLE [TableName]
ADD  DEFAULT (getutcdate()) FOR [Date]; 

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

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

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

Другие вопросы по тегам