15

私たちのデータベースには、で作成されたテーブルがありますANSI_NULLS OFF。これで、このテーブルを使用してビューを作成しました。そして、このビューにクラスター化されたインデックスを追加します。

クラスタ化インデックスの作成中に、この特定のテーブルのANSI_NULLがオフになっているため、インデックスを作成できないなどのエラーが表示されます。

このテーブルには大量のデータが含まれています。したがって、データを失うことなく、このオプションをオンに変更したいと思います。

このオプションを変更するためにテーブルを変更する方法はありますか?提案をお願いします。

4

3 に答える 3

2

残念ながら、再作成せずにそれを行う方法はありません。すべてのデータを使用して新しいテーブルを作成しANSI_NULLS ON、そこにコピーする必要があります。

次のようになります。

SET ANSI_NULLS ON;

CREATE TABLE new_MyTBL (
....
)

-- stop all processes changing your data at this point

SET IDENTITY_INSERT new_MyTBL ON

INSERT new_MyTBL (...)   -- including IDENTITY field 
SELECT ...               -- including IDENTITY field 
FROM MyTBL 

SET IDENTITY_INSERT new_MyTBL OFF

-- alter/drop WITH SCHEMABINDING objects at this point

EXEC sp_rename @objname = 'MyTBL', @newname = 'old_MyTBL'
EXEC sp_rename @objname = 'new_MyTBL', @newname = 'MyTBL'

-- alter/create WITH SCHEMABINDING objects at this point
-- re-enable your processes

DROP TABLE old_MyTBL      -- do that when you are sure that system works OK

依存するオブジェクトがある場合は、名前を変更するとすぐに新しいテーブルで機能します。しかし、それらのいくつかは手動で行うWITH SCHEMABINDING必要がDROPありCREATEます。

于 2012-04-09T04:30:40.200 に答える
0

上記で推奨されている SWITCH オプションを試しましたが、ID を RESEED できませんでした。理由はわかりませんでした。

代わりに、次の代替アプローチを使用しました。

  1. テーブルを含むデータベースのデータベース スナップショットを作成する
  2. 更新するテーブルのスクリプト テーブル定義
  3. 更新するテーブルを削除します (データベース スナップショットが正常に作成されていることを確認してください)。
  4. 手順 2 で取得したスクリプトから SET ANSI NULL を OFF から ON に更新し、更新されたスクリプトを実行します。テーブルが再作成されました。
  5. データベース スナップショットからテーブルにデータを入力します。 SET IDENTITY_INSERT TABLE_NAME ON INSERT INTO TABLE_NAME (PK, col1, etc.) SELECT PK, col1, etc. FROM [Database_Snapshot].dbo.TABLE_NAME SET IDENTITY_INSERT TABLE_NAME OFF
  6. 非クラスター化インデックスを手動で移行する (データベース スナップショットからスクリプトを取得する)

上記を使用して:

  • テーブル/制約名は常に同じままであるため、制約とキーについて心配する必要はありませんでした (名前を変更する必要はありません)。
  • 私はデータのバックアップ (スナップショット) を持っており、不足しているものがないことを再確認するために信頼できます。
  • ID を再シードする必要はありません

テーブルが他のテーブルで参照されている場合、テーブルの削除が必ずしも簡単ではない場合があることを認識しています。この場合はそうではありませんでした.. 私は幸運でした.

于 2015-04-27T19:45:38.783 に答える