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、行1
オブジェクト'FK_EMAILCONT_NRSEQ__25276EE5 'は列'NRSEQOPERADORA'に依存しています。
メッセージ4922、レベル16、状態9、行1
ALTER TABLE DROP COLUMN NRSEQOPERADORAは、1つ以上のオブジェクトがこの列にアクセスするために失敗しました。

そして、列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. 別のテーブルと列のセットを使用し、同じ宣言名(@ tablename、@ colname、@ default)を使用して、followスクリプトを配置すると、コードの最初の部分で制約と列が問題なく削除されますが 2番目のスクリプトはエラーメッセージを表示します(エラー見積もりと2番目のコードサンプルを参照してください)
  3. 同時に複数回作れるようにする必要があります。一度に1つのクエリを実行する余裕はありません。スクリプトを実行して、それらすべてを一度に実行しています。しかし、宣言の部分は物事を少し難しくしています。クエリごとに異なる宣言を使用すると、機能します。しかし、これが正しい方法だとは思いません。これが私が疑問に思っている理由です、どうすればこれを達成できますか?または、回避策以外の方法はありませんか?
4

1 に答える 1

0

おそらく、最初に制約 FK_ EMAILCONT _NRSEQ__25276EE5を削除する必要があります。

alter table ... drop constraint FK__EMAILCONT__NRSEQ__25276EE5
于 2012-07-30T15:00:16.933 に答える