使用来自不同表的约束删除多个列

时间:2012-07-30 14:57:34

标签: sql-server tsql

我正在尝试使用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和他的约束列

时遇到了这个错误
  

Msg 5074,Level 16,State 1,Line 1
  对象'FK_ EMAILCONT _NRSEQ__25276EE5'取决于列'NRSEQOPERADORA'。
  Msg 4922,Level 16,State 9,Line 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. 代码正常工作删除约束,删除该列。 (参见第一个代码示例)
  2. 如果我放置一个跟随脚本,使用不同的表和列的 set 但使用相同的声明名称(@ tablename,@ colname,@ default),代码的第一部分< strong>将删除约束和列没有任何问题,但第二个脚本将显示错误消息(请参阅错误引用和第二个代码示例)
  3. 我需要能够同时制作一次以上。我不能承受一次运行一个查询,我正在做一个脚本来一次执行它们。但宣言部分使事情变得更加艰难。如果我为每个查询使用不同的声明,它将会起作用;但我认为这不是正确的做法。这就是我想知道的原因,我怎么能做到这一点?或者除了解决方法之外还有没办法

1 个答案:

答案 0 :(得分:0)

可能你首先需要删除约束FK_ EMAILCONT _NRSEQ__25276EE5 尝试

alter table ... drop constraint FK__EMAILCONT__NRSEQ__25276EE5