【问题标题】:Delete multiple columns with constraints from different tables从不同的表中删除具有约束的多个列
【发布时间】:2012-07-31 04:50:29
【问题描述】:

我正在尝试使用 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,第 1 行
对象“FK_EMAILCONT_NRSEQ__25276EE5”依赖于列“NRSEQOPERADORA”。
消息 4922,第 16 级,状态 9,第 1 行
ALTER TABLE DROP COLUMN NRSEQOPERADORA 失败,因为一个或多个对象访问此列。

并且NRSEQOPERADORA 的列不会下降。

如果我为 each 声明使用不同的名称,我可以做到(但不仅有 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. 代码 works 删除约束,删除列。 (参见第一个代码示例)
  2. 如果我放置一个跟随脚本,set 不同的表和列但使用相同的声明名称(@tablename、@colname、@default),代码的第一部分 将删除约束和列没有任何问题,但第二个脚本将显示错误消息(请参阅错误引用和第二个代码示例)
  3. 我需要能够同时进行多次。我不能一次运行一个查询,我正在编写一个脚本来一次执行它们。但是声明部分让事情变得更难了。如果我为每个查询使用不同的声明,它会起作用;但我认为这不是正确的做法。这就是为什么我想知道,我怎么能做到这一点?或者除了变通方法之外还有没有办法

【问题讨论】:

  • 注意代码,先去掉约束,再去掉列。问题是:第二个代码无法访问(或覆盖)声明。而且我不能使用同名的多个声明。我可以为每个声明使用不同的名称,但我想以“正确的方式”这样做

标签: sql-server tsql


【解决方案1】:

您可能首先需要删除约束 FK_EMAILCONT_NRSEQ__25276EE5 试试

alter table ... drop constraint FK__EMAILCONT__NRSEQ__25276EE5

【讨论】:

  • 是的,第一个代码,放下我的约束,然后放下列。我的问题是当我尝试使用第二个代码时。 (使用另一个表和另一个列)因为他们没有找到声明,或者尝试使用它并且不能。这就是idk,我也不能解决这个问题。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多