sql server 刪除表字段和字段的約束

2022-03-28 15:13:10 字數 3224 閱讀 3529

刪除資料庫表中的字段時,使用了 :alter table 表名 drop column 列名

伺服器返回的錯誤為:

server: msg 5074, level 16, state 1, line 1

the object 約束名 is dependent on column 列名.

server: msg 4922, level 16, state 1, line 1

alter table drop column 列名 failed because one or more objects access this column.

解決方法是先刪除所有關於這一列的約束,然後在開始刪除這一列

下面的**為刪除表 b_file 中的 name 列。

declare

@sqlcmd

nvarchar(1024

);declare

@tbname

nvarchar(180), --

要處理的表名

@fdname

nvarchar(180), --

要處理的欄位名

@delfield

bit=1--

0只刪除關係,1同時刪除字段

set@tbname='

b_file';

set@fdname='

name';

begin

--定義游標.

declare c_test_main cursor fast_forward for

--預設值約束

select sql=

'alter table [

'+b.name+

'] drop constraint [

'+d.name+']

'from

syscolumns a

join sysobjects b on a.id=b.id and a.name=

@fdname

and b.name=

@tbname

join syscomments c on a.cdefault=

c.id

join sysobjects d on c.id=

d.id

union

--外來鍵引用

select s=

'alter table [

'+c.name+

'] drop constraint [

'+b.name+']

'from

sysforeignkeys a

join sysobjects b on b.id=

a.constid

join sysobjects c on c.id=

a.fkeyid

join syscolumns d on d.id=c.id and a.fkey=d.colid and d.name=

@fdname

join sysobjects e on e.id=a.rkeyid and e.name=

@tbname

join syscolumns f on f.id=e.id and a.rkey=

f.colid

union

--主鍵/唯一鍵/索引

select

case

when e.xtype in('

pk','

uq') then

'alter table [

'+c.name+

'] drop constraint [

'+e.name+']

'else

'drop index [

'+c.name+

'].[

'+a.name+']

'end

from

sysindexes a

join sysindexkeys b on a.id=b.id and a.indid=

b.indid

join sysobjects c on b.id=c.id and c.xtype='u

'and c.name=

@tbname

join syscolumns d on b.id=d.id and b.colid=d.colid and d.name=

@fdname

left

join sysobjects e on e.id=

object_id

(a.name)

where a.indid not

in(0,255

)

--開啟游標.

open

c_test_main;

--填充資料.

fetch

next

from c_test_main into

@sqlcmd

;

--假如檢索到了資料,才處理.

while

@@fetch_status=0

begin

print

@sqlcmd

;

exec sp_executesql @sqlcmd;--

執行約束的刪除操作

--填充下一條資料.

fetch

next

from c_test_main into

@sqlcmd

;

end;

--關閉游標

close

c_test_main;

--釋放游標.

deallocate

c_test_main;

end;

if@delfield=1

begin

--判斷表是否存在

--if exists (select 1 from sys.tables where name=@tbname and type = 'u')

--判斷列是否存在

ifcol_length(@tbname, @fdname) is

notnull

exec('

alter table ['+

@tbname+'

] drop column ['+

@fdname+'

]')

end

表字段的處理 Sql Server

目錄 表的建立 建立約束 檢視約束 刪除約束 插入資料 增加字段 刪除字段 create table student 學號 char 8 not null,姓名 char 8 not null,性別 char 2 not null,出生日期 date default getdate 班級 char ...

Oracle 刪除新增表字段

原文 1.新增字段 alter table 表名 add 字段 字段型別 default 輸入預設值 null not null 2.新增備註 comment on column 庫名.表名.欄位名 is 輸入的備註 如 我要在ers data庫中 test表 document type欄位新增備註...

對Sql Server表字段進行修改

通用式 alter table 表名 add 欄位名 字段屬性 default 預設值 default 是可選引數 增加字段 alter table 表名 add 欄位名 smallint default 0 增加數字字段,整型,預設值為0 alter table 表名 add 欄位名 int de...