带有约束的SQL Server 2000删除列

时间:2009-04-21 21:13:59

标签: sql-server sql-server-2000

我遇到与this question中描述的问题相同的问题,但是它的SQL Server 2005和“接受”的答案在SQL Server 2000中不起作用。

具体来说:我正在尝试运行ALTER TABLE foo DROP COLUMN bar,但由于存在“默认约束”,因此失败了。这意味着,我在该列上有一个默认值,SQL Server将其作为一个单独的约束实现,我需要先删除它。

问题是在创建列时没有给出默认约束的名称,所以我必须查询系统表以发现约束的(自动生成的)名称。

其他问题给出的答案在SQL Server 2005中适用于我,但在SQL Server 2000中没有。我需要后者。

[更新]我需要一个查询,它可以回答问题“表bar中列foo的默认约束的名称是什么”。不是人类手动找到答案的方式。

4 个答案:

答案 0 :(得分:3)

只是弄清楚引用的SQL 2005查询实际上在做什么。这是在SQL 2000中运行的查询的复制

select 
    col.name, 
    col.colorder, 
    col.cdefault, 
    OBJECTPROPERTY(col.cdefault, N'IsDefaultCnst') as is_defcnst, 
    dobj.name as def_name
from syscolumns col 
    left outer join sysobjects dobj 
        on dobj.id = col.cdefault and dobj.type = 'D' 
where col.id = object_id(N'dbo.table_name') 
and dobj.name is not null

答案 1 :(得分:1)

要获取表的默认约束列表,请尝试此

select * from sysobjects [constraint] 
 join sysobjects [table] on [constraint].parent_obj = [table].id 
where [constraint].type = 'D'
 and [table].name = 'table_name'
--another option: and [table].id = OBJECT_ID(N'dbo.table_name')

答案 2 :(得分:0)

sp_help 'tablename'

为您提供了一堆关于表的信息 - 包括所有约束和约束名称

实际上sp_help称之为:

sp_helpconstraint 'tablename', nomsg

默认约束将显示“列xxx上的默认值”

答案 3 :(得分:0)

这个是由bdukes提供的第一个解决方案构建的,与information_schema.columns混合,似乎info包含默认所属列的序号位置

SELECT name 
FROM sysobjects [constraint] 
 JOIN sysobjects [table] on [constraint].parent_obj = [table].id
 JOIN information_schema.columns col ON [table].name = col.table_name AND [constraint].info = col.ordinal_position
WHERE [constraint].type = 'D'
 AND [table].name = 'table_name'
 AND col.column_name = 'column_name'