Moh*_*Ali 39 sql t-sql database sql-server
我有一个像这样的列的表当前是活的:
name NVARCHAR(128) NOT NULL DEFAULT ''
Run Code Online (Sandbox Code Playgroud)
我正在改变这样的列,使其可以为空:
ALTER TABLE mytable ALTER COLUMN name NVARCHAR(128) NULL
Run Code Online (Sandbox Code Playgroud)
但是,在表的一个实例中名为"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
Run Code Online (Sandbox Code Playgroud)
可以在此处找到可用于实现此目的的另一个脚本: 如何在不知道其名称的情况下删除SQL默认约束?
谢谢!
buc*_*ley 60
这是你放弃约束的方法
ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname, table_name>
DROP CONSTRAINT <default_constraint_name, sysname, default_constraint_name>
GO
Run Code Online (Sandbox Code Playgroud)
用脚本
-- 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
Run Code Online (Sandbox Code Playgroud)
积分转到Jon Galloway http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx
小智 7
我会建议:
DECLARE @sqlStatement nvarchar(MAX),
@tableName nvarchar(50) = 'TripEvent',
@columnName nvarchar(50) = 'CreatedDate';
SELECT @sqlStatement = 'ALTER TABLE ' + @tableName + ' DROP CONSTRAINT ' + dc.name + ';'
FROM sys.default_constraints AS dc
LEFT JOIN sys.columns AS sc
ON (dc.parent_column_id = sc.column_id)
WHERE dc.parent_object_id = OBJECT_ID(@tableName)
AND type_desc = 'DEFAULT_CONSTRAINT'
AND sc.name = @columnName
PRINT' ['+@tableName+']:'+@@SERVERNAME+'.'+DB_NAME()+'@'+CONVERT(VarChar, GETDATE(), 127)+'; '+@sqlStatement;
IF(LEN(@sqlStatement)>0)EXEC sp_executesql @sqlStatement
Run Code Online (Sandbox Code Playgroud)
我想参考之前的问题,因为我也遇到过同样的问题并通过此解决方案解决了。首先,约束总是Hash以其名称中的值来构建。所以问题是这HASH在不同的机器或数据库中是不同的。例如DF__Companies__IsGlo__6AB17FE4这里6AB17FE4是哈希值(8 位)。所以我指的是一个对所有人都富有成效的脚本
DECLARE @Command NVARCHAR(MAX)
declare @table_name nvarchar(256)
declare @col_name nvarchar(256)
set @table_name = N'ProcedureAlerts'
set @col_name = N'EmailSent'
select @Command ='Alter Table dbo.ProcedureAlerts Drop Constraint [' + ( select 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 c.name = @col_name) + ']'
--print @Command
exec sp_executesql @Command
Run Code Online (Sandbox Code Playgroud)
它将删除您的默认约束。但是,如果您想再次创建它,您可以简单地尝试这个
ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]
Run Code Online (Sandbox Code Playgroud)
最后,只需运行DROP命令即可删除该列。
| 归档时间: |
|
| 查看次数: |
85569 次 |
| 最近记录: |