Изменить колонку, добавить ограничение по умолчанию
У меня есть таблица, а один из столбцов - "Дата" типа datetime. Мы решили добавить ограничение по умолчанию к этому столбцу
Alter table TableName
alter column dbo.TableName.Date default getutcdate()
но это дает мне ошибку:
Неверный синтаксис рядом с..
Кто-нибудь видит что-то явно неправильное здесь, которое мне не хватает (кроме лучшего имени столбца)
Ответы
Ответ 1
Попробуйте это
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
Ответ 2
вы можете заключить зарезервированные слова в квадратные скобки, чтобы избежать таких ошибок:
dbo.TableName.[Date]
Ответ 3
Я использую хранимую процедуру ниже для обновления значений по умолчанию в столбце.
Он автоматически удаляет все предыдущие значения по умолчанию в столбце перед добавлением нового значения по умолчанию.
Примеры использования:
-- 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.
Ответ 4
На самом деле вам нужно сделать как ниже Пример, который поможет решить проблему...
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
Ответ 5
Вы указываете имя таблицы дважды. Часть ALTER TABLE называет таблицу. Попробуйте: Изменить таблицу TableName изменить столбец [Дата] по умолчанию getutcdate()
Ответ 6
изменить ограничение удаления таблицы TableName DF_TableName_WhenEntered
изменить таблицу TableName добавить ограничение DF_TableName_WhenEntered по умолчанию getutcdate() для WhenEntered