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