一尘不染

在TSQL中的列上删除默认约束

sql

我有一个带有这样的列的表,当前处于活动状态:

name NVARCHAR(128) NOT NULL DEFAULT ''

我正在像这样更改列以使其可为空:

ALTER TABLE  mytable ALTER COLUMN name NVARCHAR(128) NULL

但是,仍保留表的一个实例中名为“
DF__mytable__datab__7DE4B36”的默认约束。我知道,如果原始作者为约束命名,则可以避免这种情况。我有这些表的几个实例,但我不想手动删除我拥有的每个表中的每个约束。将默认约束放到我可以统一应用于此表的每个实例的Sql
Server列上的最简单,最优雅的方法是什么?

编辑

这是我最终使用的脚本:

DECLARE @table_id AS INT
DECLARE @name_column_id AS INT
DECLARE @sql nvarchar(255)

-- Find table id
SET @table_id = OBJECT_ID('mytable')

-- Find name column id
SELECT @name_column_id = column_id
FROM sys.columns
WHERE object_id = @table_id
AND name = 'name'

-- Remove default constraint from name column
SELECT @sql = 'ALTER TABLE mytable DROP CONSTRAINT ' + D.name
FROM sys.default_constraints AS D
WHERE D.parent_object_id = @table_id
AND D.parent_column_id = @name_column_id
EXECUTE sp_executesql @sql

可在此处找到另一个可用于完成此任务的脚本:
如何在不知道其名称的情况下删除SQL默认约束?

谢谢!


阅读 188

收藏
2021-03-17

共1个答案

一尘不染

这就是您如何摆脱约束

ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname, table_name>
   DROP CONSTRAINT <default_constraint_name, sysname, default_constraint_name>
GO

带有脚本

-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)

set @database = 'dotnetnuke'
set @table = 'tabs'

DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    exec    sp_executesql @sql
END

致谢Jon Galloway,
网址为http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

2021-03-17