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


187

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

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

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

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

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


11
Не используйте типы или ключевые слова в качестве имен столбцов!
Джон

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

Ответы:


349

Попробуй это

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

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

dbo.TableName.[Date]

1
Кажется плохой идеей использовать зарезервированные слова для имен столбцов.
Норберт Норбертсон

4
Кажется, но это не так. Я использую их успешно с 2004 года :)
Cătălin Rădoi

7

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

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

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

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

5

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

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

Это просто использовать для практики, не может использовать в реальности
Trương Long

0

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


0

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

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


этот ответ также содержит запрос на удаление. Если кто-то ранее добавил getdate (), и теперь ему нужно изменить его на getutcdate (). он мог бы получить некоторую помощь через этот ответ. @RalfFriedl
Абхиджит Пуджари
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.