Изменить столбец, добавить ограничение по умолчанию
У меня есть таблица и один из столбцов "Дата" типа 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()