在Microsoft SQL Server中,我知道判断列是否存在默认约束并删除默认约束的查询是:

IF EXISTS(SELECT * FROM sysconstraints
  WHERE id=OBJECT_ID('SomeTable')
  AND COL_NAME(id,colid)='ColName'
  AND OBJECTPROPERTY(constid, 'IsDefaultCnst')=1)    
ALTER TABLE SomeTable DROP CONSTRAINT DF_SomeTable_ColName

但由于之前版本的数据库中存在打字错误,约束的名称可能是DF_SomeTable_ColNameDF_SmoeTable_ColName.

如何在没有任何SQL错误的情况下删除默认约束?默认的约束名称不会出现在INFORMATION_SCHEMA表中,这让事情变得有点棘手.

因此,类似"删除此表/列中的默认约束"或"删除DF_SmoeTable_ColName"之类的内容,但如果找不到,请不要给出任何错误.

推荐答案

下面的脚本将扩展Mitch Wheat的代码,生成删除约束并动态执行的命令.

declare @schema_name nvarchar(256)
declare @table_name nvarchar(256)
declare @col_name nvarchar(256)
declare @Command  nvarchar(1000)

set @schema_name = N'MySchema'
set @table_name = N'Department'
set @col_name = N'ModifiedDate'

select @Command = 'ALTER TABLE ' + @schema_name + '.[' + @table_name + '] DROP CONSTRAINT ' + d.name
 from sys.tables t
  join sys.default_constraints d on d.parent_object_id = t.object_id
  join sys.columns c on c.object_id = t.object_id and c.column_id = d.parent_column_id
 where t.name = @table_name
  and t.schema_id = schema_id(@schema_name)
  and c.name = @col_name

--print @Command

execute (@Command)

Sql相关问答推荐

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

删除MariaDB数据库中的JSON数据

对多个条件的SQL进行排名

如何从Spark SQL的JSON列中提取动态数量的键值对

带上最后日期(结果)

我可以在SQLite3中使用BLOB作为主键吗?

使用同一个表,为什么IN、NOT IN、NOT EXISTS和EXISTS有不同的输出?

根据标识符将两行合并为一行

我需要在 ASP.NET C# 中获取 2 个 SQL 查询结果的平均值

错误:postgresql 中缺少表评级的 FROM 子句条目

BigQuery导航函数计算ID

使用SQLAlchemy和Postgres数据库创建新行时,为什么我的创建日期比更新日期晚?

插入行时的行安全策略问题

根据是否存在值组合分组并 Select 行

强制 SQL 始终通过 R 从视图中返回至少一行

joins 组合多个重复数据删除策略

postgres按组消除分区中的NULLS

在 MS Access 中连接相关记录

交叉应用 OPENJSON / PIVOT - 错误的顺序

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON