이름이없는 기본값 제약 조건 및 알 수없는 색인으로 열을 삭제하는 방법
-
19-09-2019 - |
문제
열을 삭제하기 전에 삭제하기 위해 열에 기본 제약 조건이 있는지, 이름에 기본 제약이 있는지 여부와 인덱스 이름을 결정하는 방법은 무엇입니까?
해결책
다음 유틸리티 Procs는 작업을 수행합니다.
if (exists (select * from [dbo].sysobjects where (id = object_id(N'[dbo]._spDropDefaultValueConstraint')) and (xtype = 'P')))
drop procedure [dbo]._spDropDefaultValueConstraint
GO
create procedure [dbo]._spDropDefaultValueConstraint
@TableName varchar(256),
@ColumnName varchar(256)
as
/* This proc will drop the default value constraint on
a column even when you don't know what its name is.
*/
declare @ConstraintName varchar(256)
set @ConstraintName = (
select
dobj.name
from sys.columns col
left outer join sys.objects dobj
on dobj.object_id = col.default_object_id and dobj.type = 'D'
where col.object_id = object_id('[dbo].'+@TableName)
and dobj.name is not null
and col.name = @ColumnName)
if(isnull(@ConstraintName, '') <> '')
exec('alter table [dbo].['+@TableName+'] drop constraint ['+@ConstraintName+']')
GO
-------------------------------------------------------------------------------------------
if (exists (select * from [dbo].sysobjects where (id = object_id(N'[dbo]._spDropIndexesForColumn')) and (xtype = 'P')))
drop procedure [dbo]._spDropIndexesForColumn
GO
create procedure [dbo]._spDropIndexesForColumn
@TableName varchar(256),
@ColumnName varchar(256)
as
/* This proc will drop all indexes on a column, both indexes
and unique constraints as well as multi-part indexes that reference it.
*/
declare @IndexName varchar(256)
declare @IsPrimaryKey bit
declare @IsUniqueConstraint bit
declare crIndexes cursor for
select
ind.name, ind.is_primary_key, ind.is_unique_constraint
from
sys.indexes ind
inner join sys.index_columns ic on ind.object_id = ic.object_id and ind.index_id = ic.index_id
inner join sys.columns col on ic.object_id = col.object_id and ic.column_id = col.column_id
inner join sys.tables t on ind.object_id = t.object_id
where
t.name = @TableName and
col.name = @ColumnName
open crIndexes
fetch next from crIndexes into @IndexName, @IsPrimaryKey, @IsUniqueConstraint
while(@@fetch_status = 0) begin
if(@IsPrimaryKey = 1) or (@IsUniqueConstraint = 1)
exec('alter table [dbo].['+@TableName+'] drop constraint ['+@IndexName+']')
else
exec('drop index [dbo].['+@TableName+'].['+@IndexName+']')
fetch next from crIndexes into @IndexName, @IsPrimaryKey, @IsUniqueConstraint
end
close crIndexes
deallocate crIndexes
GO
-------------------------------------------------------------------------------------------
if (exists (select * from [dbo].sysobjects where (id = object_id(N'[dbo]._spDropColumn')) and (xtype = 'P')))
drop procedure [dbo]._spDropColumn
GO
create procedure [dbo]._spDropColumn
@TableName varchar(256),
@ColumnName varchar(256)
as
/* This proc will drop a column (first dropping the default value
constraint and any indexes if they exist) if it exists.
*/
if (exists (select * from [dbo].sysobjects where (id = object_id('[dbo].'+@TableName)) and (xtype = 'U'))) and
(exists (select * from [dbo].syscolumns where (id = object_id('[dbo].'+@TableName)) and (name = @ColumnName))) begin
exec [dbo]._spDropIndexesForColumn @TableName, @ColumnName
exec [dbo]._spDropDefaultValueConstraint @TableName, @ColumnName
exec('alter table [dbo].['+@TableName+'] drop column ['+@ColumnName+']')
end
GO
그런 다음 다음과 같이 호출하기 쉽습니다.
exec [dbo]._spDropColumn 'TableName', 'ColumnName'
우리가 사용하지 않기 때문에 외국의 주요 제약 조건을 보지 못했지만 아마도 그것들도 포함될 수 있습니다.
제휴하지 않습니다 StackOverflow