[點(diǎn)晴永久免費(fèi)OA]如何查詢(xún)Sql Server中所有默認(rèn)值約束并刪除它們
今天遇到一個(gè)問(wèn)題,就是要將某數(shù)據(jù)庫(kù)中所有PNumber列刪除,這個(gè)數(shù)據(jù)庫(kù)基本上所有表都有這個(gè)字段,所以我寫(xiě)了一段sql來(lái)刪除所有的PNumber列,如下:
declare @columnname nvarchar(1000) declare my_cur cursor local for select b.name from sys.syscolumns a inner join sys.tables b on a.id=b.object_id where a.name=''PreNumber'' open my_cur fetch next from my_cur into @columnname while @@fetch_status=0 begin exec (''alter table ''+@columnname+'' drop column PreNumber'') fetch next from my_cur into @columnname end close my_cur deallocate my_cur sql是沒(méi)有問(wèn)題的,但執(zhí)行的時(shí)候報(bào)了類(lèi)似下面的錯(cuò)誤: 消息 5074,級(jí)別 16,狀態(tài) 1,第 2 行 對(duì)象''DF_XXXX_PNumber_Default'' 依賴(lài)于 列''PNumber''。 消息 4922,級(jí)別 16,狀態(tài) 9,第 2 行 由于一個(gè)或多個(gè)對(duì)象訪(fǎng)問(wèn)此列,ALTER TABLE DROP COLUMN Creator 失敗。 原因就是創(chuàng)建PNumber列的時(shí)候?yàn)镻Number列創(chuàng)建了默認(rèn)值,所以我們通過(guò)sql命令刪除時(shí)會(huì)要求我們先刪除對(duì)應(yīng)的默認(rèn)值約束(如果直接在設(shè)計(jì)器中刪除不會(huì)有此要求,設(shè)計(jì)器會(huì)同時(shí)刪除對(duì)應(yīng)的約束)。 那么我們要怎么找出數(shù)據(jù)庫(kù)中所有表中PNumber列的默認(rèn)值約束呢?這時(shí)候就需要利用sys.default_constraints目錄視圖了。 sys.default_constraints目錄視圖我們所有定義的默認(rèn)值都可以通過(guò)這個(gè)目錄視圖查詢(xún)出來(lái),sys.default_constraints中有幾個(gè)重要的列: 1,Name 約束名稱(chēng) 2,parent_object_id 所屬表的表標(biāo)識(shí) 3,parent_column_id 默認(rèn)值對(duì)應(yīng)列的列標(biāo)識(shí) 4,definition 默認(rèn)值的定義 5,is_system_named 約束名稱(chēng)是不是自已定義的, 0代表是自己定義的,1代表是系統(tǒng)定義的。 有了這些信息,我可以鏈接sys.columns表與object_name函數(shù)查出默認(rèn)值對(duì)應(yīng)的表名與列名,sql如下: select name as 默認(rèn)值名稱(chēng), object_name(t.parent_object_id) as 表名, (select sys.columns.name from sys.columns where sys.columns.column_id=t.parent_column_id and sys.columns.object_id=t.parent_object_id) as 列名, t.definition from sys.default_constraints t 如同批量刪除列一樣,我們可以寫(xiě)一個(gè)游標(biāo),循環(huán)刪除所有的默認(rèn)值。 declare @name varchar(100) declare @tablename varchar(100) declare my_cur cursor local for select a.name,a.tablename from (select name, object_name(t.parent_object_id) as tableName, (select sys.columns.name from sys.columns where sys.columns.column_id=t.parent_column_id and sys.columns.object_id=t.parent_object_id) as columnName, t.definition from sys.default_constraints t) a where columnname=''PNumber'' open my_cur fetch next from my_cur into @name,@tablename while @@fetch_status=0 begin exec (''alter table ''+@tablename+'' drop constraint ''+@name) fetch next from my_cur into @name,@tablename end close my_cur deallocate my_cur 查詢(xún)指定表cs_test2_list中字段time7是否存在約束值: select a.name from (select name,object_name(t.parent_object_id) as tableName,(select sys.columns.name from sys.columns where sys.columns.column_id=t.parent_column_id and sys.columns.object_id=t.parent_object_id) as columnName,t.definition from sys.default_constraints t) a where columnname=''time7'' and tablename=''cs_test2_list'' 該文章在 2019/9/28 20:48:02 編輯過(guò) |
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)... |