更改列默认值
问题的原因是在使用ALTER COLUMN语句修改列的默认值时,语法错误。解决方法是使用ALTER TABLE语句结合ADD CONSTRAINT语句来添加默认约束。
ALTER TABLE语句用于修改表的结构,包括列的属性和约束。ALTER COLUMN子句用于修改列的属性,例如数据类型、长度和默认值。在这里,我们想要修改MyTable表中CreateDate列的默认值。
原始的语句中使用了ALTER COLUMN语句来修改列的默认值。然而,这是错误的语法,因为ALTER COLUMN语句不能直接用于修改默认值。正确的做法是使用ALTER TABLE语句结合ADD CONSTRAINT语句来添加默认约束。
在修正后的语句中,首先使用ALTER TABLE语句来修改列的属性。ALTER COLUMN CreateDate DATETIME NOT NULL表示将CreateDate列的数据类型修改为DATETIME,并设置为非空。
然后,使用ALTER TABLE语句结合ADD CONSTRAINT语句来添加默认约束。ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate表示为CreateDate列添加一个名为DF_Constraint的默认约束,该约束的默认值为GetDate()函数的返回值。
通过这样的修正,我们成功地解决了使用ALTER COLUMN修改列的默认值的问题。
问题:如何更改SQL服务器中列的默认值?
原因:SQL服务器没有直接的方法来更改列的默认值。
解决方法:使用以下参数化脚本来更改列的默认值:
DECLARE @TableName NVARCHAR(100); DECLARE @ColumnName NVARCHAR(100); DECLARE @DefaultValue NVARCHAR(100); SET @TableName = N'TableName'; SET @ColumnName = N'ColumnName'; SET @DefaultValue = N'0'; IF EXISTS ( SELECT name FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID(@TableName) AND parent_column_id = COLUMNPROPERTY(OBJECT_ID(@TableName), @ColumnName, 'ColumnId') ) BEGIN DECLARE @ConstraintName AS NVARCHAR(200); DECLARE @AlterTableStatement AS NVARCHAR(2000); SELECT @ConstraintName = name FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID(@TableName) AND parent_column_id = COLUMNPROPERTY(OBJECT_ID(@TableName), @ColumnName, 'ColumnId'); SET @AlterTableStatement = N'ALTER TABLE ' + @TableName + N' DROP CONSTRAINT ' + @ConstraintName + N'; ALTER TABLE ' + @TableName + N' ADD CONSTRAINT ' + @ConstraintName + N' DEFAULT ' + @DefaultValue + N' FOR ' + @ColumnName; EXECUTE sp_executesql @AlterTableStatement; END;
只需填写参数并执行脚本。该脚本将移除现有的约束,并创建一个具有指定默认值的新约束。这是所有与“如何更改列的默认值”相关问题的最佳答案。它考虑到存在默认值并且默认值可能具有系统生成的名称,可以进行脚本化,不依赖于手动观察/操作。
问题出现的原因是在使用Alter Table
命令时,与Create Table
命令之间的混淆。在Create Table
中,可以同时添加默认值和默认约束,但是在Alter Table
中,使用ALTER COLUMN
无法添加约束。因此,需要编写两个不同的语句来分别更改列和添加默认约束。
解决方法如下:
1. 首先使用ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
来更改列的属性。
2. 然后再使用ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
来添加默认约束。
希望这可以帮助你解决问题!