修改列,添加默认约束

我有一个表,其中一列是类型为datetime的“日期”。我们决定向该列添加一个默认约束

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

但这给了我错误:

'.'附近语法错误。

有人看到这里有什么明显的错误吗,这是我遗漏的(除了为列取一个更好的名字)

381861 次浏览

你可以用方括号括起保留字来避免这些错误:

dbo.TableName.[Date]

试试这个

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

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

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

用法示例:

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

您指定了两次表名。ALTER TABLE部分为表命名。 试一试: 修改表TableName alter column [Date] default gettcdate ()

. gettcdate (

修改表TableName drop constraint DF_TableName_WhenEntered

修改表TableName 添加约束DF_TableName_WhenEntered default getutcdate() for WhenEntered

我确认像JohnH的评论,永远不要在你的对象名称中使用列类型! 这是令人困惑的。

试试这个:

ALTER TABLE [TableName]
ADD  DEFAULT (getutcdate()) FOR [Date];