我試圖使用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
編輯:
- 工作的構造函數的代碼aint被刪除,列被刪除。 (請參閱第一個代碼示例)
- 如果我將一個跟隨腳本與設置爲不同的表和列,但使用相同的聲明名稱(@tablename,@colname,@default),代碼的第一部分將刪除約束和列沒有任何問題,但第二個腳本將顯示一條錯誤消息(請參閱錯誤報價和第二個代碼示例)
- 我需要能夠在同一時間多次。我無法承受一次運行一個查詢,我正在執行腳本來一次執行它們。但Declare部分正在讓事情變得更加困難。如果我爲每個查詢使用不同的聲明,它就會工作;但我認爲這不是正確的做法。這就是爲什麼我想知道,我怎麼能做到這一點?或者還有沒辦法除了解決方法?
注意到代碼,首先刪除約束,然後將其丟棄列。問題是:第二個代碼無法訪問(或覆蓋)聲明。我不能使用多個同名的聲明。我可以爲每個聲明使用不同的名稱,但我想以「正確的方式」執行它 – 2012-07-30 15:06:02