我遇到与this question中描述的问题相同的问题,但是它的SQL Server 2005和“接受”的答案在SQL Server 2000中不起作用。
具体来说:我正在尝试运行ALTER TABLE foo DROP COLUMN bar
,但由于存在“默认约束”,因此失败了。这意味着,我在该列上有一个默认值,SQL Server将其作为一个单独的约束实现,我需要先删除它。
问题是在创建列时没有给出默认约束的名称,所以我必须查询系统表以发现约束的(自动生成的)名称。
其他问题给出的答案在SQL Server 2005中适用于我,但在SQL Server 2000中没有。我需要后者。
[更新]我需要一个查询,它可以回答问题“表bar
中列foo
的默认约束的名称是什么”。不是人类手动找到答案的方式。
答案 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'