Изменить столбец, добавить ограничение по умолчанию
У меня есть таблица и один из столбцов "дата" типа datetime. Мы решили добавить ограничение по умолчанию в этот столбец
Alter table TableName
alter column dbo.TableName.Date default getutcdate()
но это дает мне ошибку:
неправильный синтаксис около '.-
кто-нибудь видит здесь что-то явно неправильное, чего мне не хватает (кроме лучшего имени для столбца)
5 ответов:
попробуй такое
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также убедитесь, что вы назвали значение по умолчанию constraint..it будет боль в шее, чтобы бросить его позже, потому что у него будет одно из этих сумасшедших системных имен...Смотрите также как назвать ограничения по умолчанию и как удалить ограничение по умолчанию без имени в SQL Server
Я использую хранимые процедуры ниже, чтобы обновить значения по умолчанию для столбца.
он автоматически удаляет все предыдущие значения по умолчанию в столбце, перед добавлением нового значения по умолчанию.
примеры использования:
-- 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ошибки, эта хранимая процедура исключает
Если вы попытаетесь добавить значение по умолчанию в столбец, когда он уже существует, вы получите следующую ошибку (что-то вы никогда не будете смотрите, если с помощью этого сохраненного proc):
-- 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.
вы можете заключить зарезервированные слова в квадратные скобки, чтобы избежать таких ошибок:
dbo.TableName.[Date]
на самом деле вы должны сделать, как показано ниже пример, который поможет решить эту проблему...
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
вы указываете имя таблицы дважды. Часть ALTER TABLE называет таблицу. Пытаться: Изменение таблицы Имя_таблицы изменить столбец [дата] по умолчанию getutcdate ()
Comments