sql - SQL Server中如何更改列的默认值

标签 sql database sql-server-2008

假设我有一个名为 Person 的表,定义如下:

CREATE TABLE Persons
(
    P_Id uniqueidentifier Default newsequentialid() NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) DEFAULT 'Sandnes'
)

如何使用 sql 查询删除该列的默认值?此外,如果它一开始不存在,我该如何添加它。 我知道可以通过更改表并在 P_Id 列上添加约束来添加它,但我不确定这是否是唯一的方法。我遇到过this article然而那里的建议似乎并没有真正起作用。

有什么想法吗?

最佳答案

在 SQL Server 中,默认值定义为与表中特定列关联的约束。所有约束都分配了一个名称;这很重要,因为一旦约束被创建,如果你想修改它,你必须通过这个名字来引用它。 (我会关注这个问题,看看我是不是错了。)

基于这个示例表:

CREATE TABLE MyTable
 (
   MyTableId  int          not null
  ,SomeData   varchar(50)  not null  default 'Foo'
  ,MoreData   datetime     not null  default CURRENT_TIMESTAMP
 )

第 1 步:确定列上是否存在约束。有几种方法可以做到这一点,所有方法都涉及系统 View 和/或元数据功能。这是一个快速的例子,其中“MyTable”和“SomeData”可以设置为参数:

SELECT name
 from sys.default_constraints
 where parent_object_id = object_id('MyTable')
  and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')

尝试一下,您会发现生成的名称基本上是随机的。要确定列上是否存在默认值,您可以执行以下操作:

IF exists (select name
            from sys.default_constraints
            where parent_object_id = object_id('MyTable')
             and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
    PRINT 'Default found'
ELSE
    PRINT 'NoDefault'

要在不知道名称的地方删除现有默认值,您必须构建动态 SQL。 (引用文章中的代码是错误的,显然从未测试过。)@Călin 的做法与我的做法略有不同,但思路是一样的:

DECLARE @Command nvarchar(max)

SELECT @Command = 'ALTER TABLE MyTable drop constraint ' + name
 from sys.default_constraints
 where parent_object_id = object_id('MyTable')
  and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')

IF @Command is not null
    EXECUTE sp_executeSQL @Command

(通过错误检查,检查表和列的参数等。)

最后,您可以通过在创建约束时命名默认值来避免大部分情况,如下所示:

CREATE TABLE MyTable
 (
   MyTableId  int          not null
  ,SomeData   varchar(50)  not null
    constraint DF_MyTable__SomeData  default 'Foo'
  ,MoreData   datetime     not null
    constraint DF_MyTable__MoreData  default CURRENT_TIMESTAMP
 )

或者像这样:

IF not exists (select name
                from sys.default_constraints
                where parent_object_id = object_id('MyTable')
                 and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
    ALTER TABLE MyTable
     add constraint DF_MyTable__SomeData
      default 'Foo' for SomeData

关于sql - SQL Server中如何更改列的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9603428/

相关文章:

sql - 如何强制 SQL Server 以特定顺序执行查询

c# - 在 SQL CLR 中访问 COM

sql-server - 为管理员用户启用的 xp_cmdshell 访问被拒绝

python - 使用 Python 打开文本文件并另存为 SQL 文件

MySql如何返回包含所有选定功能的所有项目

mysql - 数据库中用户全名的典型长度应该是多少

database - 在循环内部或外部提交更好?

php - 在mysql中使用GET插入数据

c# - SqlBulkCopy 到 Sql Server 2008 中的临时表

sql - 我应该使用快速查询提示 number_rows/FASTFIRSTROW 吗?