改变列,添加默认约束

我有一个表,其中一列是“date”types的date时间。 我们决定向该列添加默认约束

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

但是这给了我错误:

“。”附近的语法错误

有没有人看到任何明显的错误,我错过了(除了有一个更好的名字为列)

尝试这个

 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中的名称

您可以将保留字包装在方括号中以避免以下types的错误:

 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 

我使用下面的存储过程来更新列上的默认值。

在添加新的默认值之前,它会自动删除列上的所有默认值。

用法示例:

 -- 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, eg '[dbo].[TableName]' @TABLE_NAME VARCHAR(100), -- Column name, eg 'ColumnName'. @COLUMN_NAME VARCHAR(100), -- New default, eg '''MyDefault''' or 'getdate()' -- Note that if you want to set it to a string constant, the contents -- must be surrounded by extra quotes, eg '''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.