回答:
sys.indexesビューを使用してインデックスを取得できます。このテーブルをsys.tables、sys.columns、sys.index_columnに結合して、動的ドロップインデックスを作成するための情報を取得できます。この単純な選択を使用して、ドロップインデックスを生成できます。where句を使用して、テーブルと列をフィルタリングできます。Table1.Column1を変更する場合は、それらの名前を使用してselectをフィルタリングし、正しい削除ステートメントを取得する必要があります
use [testdb]
go
declare @sqlDropIndex NVARCHAR(1000)
select @sqlDropIndex = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
from sys.indexes idx inner join
sys.tables tbl on idx.object_id = tbl.object_id inner join
sys.index_columns idxCol on idx.index_id = idxCol.index_id inner join
sys.columns col on idxCol.column_id = col.column_id
where idx.type <> 0 and
tbl.name = 'MyTableName' and
col.name = 'MyColumnName'
group by idx.name, tbl.name
order by idx.name desc
print @sqlDropIndex
--exec sp_executeSql @sqlDropIndex
go
これがあなたを助けることを願っています
最初にインデックスを削除すると、インデックスが再作成されない限り、インデックスから再び読み取ることができなくなります。制約の強制を無効にするためにできること。
ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;
このスクリプトの実行後、制約は実施されず、制約チェックを心配することなくデータを入力できます。テーブルを再度変更して、制約を再度有効にすることができます。
ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;
以前の違反はチェックまたは修正されませんが、制約が実施された後のエントリはチェックされます。
Nikoの答えには2つの間違いがあります(2つのobject_id条件がありません)。する必要はありませんgroup by
:
SELECT @sql = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
FROM sys.indexes idx
INNER JOIN sys.tables tbl ON idx.object_id = tbl.object_id
INNER JOIN sys.index_columns idxCol ON idx.index_id = idxCol.index_id AND idx.object_id = idxCol.object_id
INNER JOIN sys.columns col ON idxCol.column_id = col.column_id AND idxCol.object_id = col.object_id
WHERE idx.type <> 0
AND tbl.name = 'file_transfer_log'
AND col.name = 'tender_id';