2012-07-30 74 views
1

我試圖使用T-SQL從不同表中刪除不同的列。從不同表中刪除具有約束條件的多列

我做了這個代碼,以下一些技巧,我發現這裏的SO

/* Declaration of variable */ 
declare @tablename nvarchar(200) 
declare @colname nvarchar(200) 
declare @default sysname, @sql nvarchar(max) 

/* **** Modifications in TITULORECEBERFATURA_ITEMS**** */ 
/* Drop column NRSEQORDEM */ 
set @tablename = 'TITULORECEBERFATURA_ITEMS' 
set @colname = 'NRSEQORDEM' 

select @default = CONSTRAINT_NAME 
FROM 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
WHERE 
    TABLE_NAME = @tablename 
    AND COLUMN_NAME = @colname 

    set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default 
exec sp_executesql @sql 

set @sql = N'alter table ' + @tablename + ' drop column ' + @colname 
exec sp_executesql @sql 

上面的代碼工作沒有任何問題。但是當我在其下面添加其他代碼時,會發生錯誤。

/* Declaration of variable */ 
declare @tablename nvarchar(200) 
declare @colname nvarchar(200) 
declare @default sysname, @sql nvarchar(max) 

/* **** Modifications in TITULORECEBERFATURA_ITEMS**** */ 
/* Drop column NRSEQORDEM */ 
set @tablename = 'TITULORECEBERFATURA_ITEMS' 
set @colname = 'NRSEQORDEM 

select @default = CONSTRAINT_NAME 
FROM 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
WHERE 
    TABLE_NAME = @tablename 
    AND COLUMN_NAME = @colname 

    set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default 
exec sp_executesql @sql 

set @sql = N'alter table ' + @tablename + ' drop column ' + @colname 
exec sp_executesql @sql 

/* **** Modifications in EMAILCONTAS **** */ 
/* Drop column NRSEQOPERADORA */ 
set @tablename = 'EMAILCONTAS' 
set @colname = 'NRSEQOPERADORA' 

select @default = CONSTRAINT_NAME 
FROM 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
WHERE 
    TABLE_NAME = @tablename 
    AND COLUMN_NAME = @colname 

    set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default 
exec sp_executesql @sql 

set @sql = N'alter table ' + @tablename + ' drop column ' + @colname 
exec sp_executesql @sql 

NRSEQORDEM和他的約束被丟棄沒有問題,但我得到這個錯誤與NRSEQOPERADORA和他的約束列

消息5074,級別16,狀態1,行
對象'FK_ EMAILCONT _NRSEQ__25276EE5'依賴於'NRSEQOPERADORA'列。
消息4922,級別16,狀態9,行1
ALTER TABLE DROP COLUMN NRSEQOPERADORA失敗,因爲一個或多個對象訪問此列。

而列NRSEQOPERADORA不下降。

如果我使用不同的名稱爲每個聲明,我能做到這一點(但不僅是2,但大量的是,並沒有漂亮的做吧,我正在尋找一個「正確」的方法這樣做)

/* Declaration of variable */ 
    declare @tablename nvarchar(200) 
    declare @colname nvarchar(200) 
    declare @tablename2 nvarchar(200) 
    declare @colname2 nvarchar(200) 
    declare @default sysname, @sql nvarchar(max) 

    /* **** Modifications in TITULORECEBERFATURA_ITEMS**** */ 
    /* Drop column NRSEQORDEM */ 
    set @tablename = 'TITULORECEBERFATURA_ITEMS' 
    set @colname = 'NRSEQORDEM 

    select @default = CONSTRAINT_NAME 
    FROM 
     INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
    WHERE 
     TABLE_NAME = @tablename 
     AND COLUMN_NAME = @colname 

     set @sql = N'alter table ' + @tablename + ' drop constraint ' + @default 
    exec sp_executesql @sql 

    set @sql = N'alter table ' + @tablename + ' drop column ' + @colname 
    exec sp_executesql @sql 

    /* **** Modifications in EMAILCONTAS **** */ 
    /* Drop column NRSEQOPERADORA */ 
    set @tablename2 = 'EMAILCONTAS' 
    set @colname2 = 'NRSEQOPERADORA' 

    select @default = CONSTRAINT_NAME 
    FROM 
     INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
    WHERE 
     TABLE_NAME = @tablename2 
     AND COLUMN_NAME = @colname2 

     set @sql = N'alter table ' + @tablename2 + ' drop constraint ' + @default 
    exec sp_executesql @sql 

    set @sql = N'alter table ' + @tablename2 + ' drop column ' + @colname2 
    exec sp_executesql @sql 

編輯:

  1. 工作的構造函數的代碼aint被刪除,列被刪除。 (請參閱第一個代碼示例)
  2. 如果我將一個跟隨腳本與設置爲不同的表和列,但使用相同的聲明名稱(@tablename,@colname,@default),代碼的第一部分刪除約束和列沒有任何問題,但第二個腳本將顯示一條錯誤消息(請參閱錯誤報價和第二個代碼示例)
  3. 我需要能夠在同一時間多次。我無法承受一次運行一個查詢,我正在執行腳本來一次執行它們。但Declare部分正在讓事情變得更加困難。如果我爲每個查詢使用不同的聲明,它就會工作;但我認爲這不是正確的做法。這就是爲什麼我想知道,我怎麼能做到這一點?或者還有沒辦法除了解決方法?
+0

注意到代碼,首先刪除約束,然後將其丟棄列。問題是:第二個代碼無法訪問(或覆蓋)聲明。我不能使用多個同名的聲明。我可以爲每個聲明使用不同的名稱,但我想以「正確的方式」執行它 – 2012-07-30 15:06:02

回答

0

也許你首先需要刪除約束FK_ EMAILCONT _NRSEQ__25276EE5 嘗試

alter table ... drop constraint FK__EMAILCONT__NRSEQ__25276EE5 
+0

是的,第一個代碼,刪除我的約束,然後刪除列。我的問題是當我嘗試使用第二個代碼。 (使用另一個表和另一列),因爲他們沒有找到聲明,或嘗試使用它並且不能。這是什麼idk,我怎麼能解決這個問題。 – 2012-07-30 15:02:40