web-dev-qa-db-ja.com

SQL Serverのユーザー定義テーブルタイプの変更

SQL Serverでユーザー定義のテーブルタイプを変更するにはどうすればよいですか?

70
yogi

私の知る限り、テーブルタイプを変更/変更することはできません。別の名前でタイプを作成し、古いタイプを削除して新しい名前に変更することができます

jkrajes へのクレジット

msdn によると、「ユーザー定義のテーブルタイプ定義は作成後に変更できません」のようなものです。

63

これは一種のハックですが、機能するようです。以下は、テーブルタイプを変更する手順と例です。 1つの注意点は、テーブルタイプに加えた変更がそのオブジェクト(通常はプロシージャ)に対する重大な変更である場合、sp_refreshsqlmoduleは失敗することです。

  1. sp_renameを使用してテーブルタイプの名前を変更します。通常、名前の先頭にzを追加します。
  2. 元の名前と、テーブルタイプに加える必要のある変更を使用して、新しいテーブルタイプを作成します。
  3. 各依存関係をステップ実行し、sp_refreshsqlmoduleを実行します。
  4. 名前を変更したテーブルタイプを削除します。

EXEC sys.sp_rename 'dbo.MyTableType', 'zMyTableType';
GO
CREATE TYPE dbo.MyTableType AS TABLE(
    Id INT NOT NULL,
    Name VARCHAR(255) NOT NULL
);
GO
DECLARE @Name NVARCHAR(776);

DECLARE REF_CURSOR CURSOR FOR
SELECT referencing_schema_name + '.' + referencing_entity_name
FROM sys.dm_sql_referencing_entities('dbo.MyTableType', 'TYPE');

OPEN REF_CURSOR;

FETCH NEXT FROM REF_CURSOR INTO @Name;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXEC sys.sp_refreshsqlmodule @name = @Name;
    FETCH NEXT FROM REF_CURSOR INTO @Name;
END;

CLOSE REF_CURSOR;
DEALLOCATE REF_CURSOR;
GO
DROP TYPE dbo.zMyTableType;
GO

警告:

これはデータベースを破壊する可能性があるため、最初に開発環境でテストすることをお勧めします。

33
norlando

退屈を最小限に抑え、エラーが発生しやすい半自動スクリプトや高価なツールを必要としない簡単な手順を次に示します。

[オブジェクトエクスプローラーの詳細]ウィンドウから複数のオブジェクトのDROP/CREATEステートメントを生成できることに注意してください(この方法で生成すると、DROPおよびCREATEスクリプトがグループ化され、ドロップアクションと作成アクションの間にロジックを簡単に挿入できます)。

Drop and Create To

  1. 何か問題が発生した場合に備えて、データベースをバックアップしてください!
  2. すべての依存関係に対してDROP/CREATEステートメントを自動的に生成します(または、すべての「プログラマビリティ」オブジェクトに対して生成して、依存関係を見つける手間を省きます)。
  3. DROPとCREATE [dependencies]ステートメントの間に(すべてのDROPの後、すべてのCREATEの前に)、生成されたDROP/CREATE [テーブルタイプ]ステートメントを挿入し、CREATE TYPEで必要な変更を行います。
  4. スクリプトを実行します。これにより、すべての依存関係/ UDTTが削除され、[変更されたUDTT] /依存関係が再作成されます。

インフラストラクチャアーキテクチャを変更することが理にかなっている小規模なプロジェクトがある場合は、ユーザー定義のテーブルタイプを削除することを検討してください。 Entity Frameworkおよび同様のツールを使用すると、データロジックのすべてではないにしても、ほとんどの場合、保守が容易なコードベースに移動できます。

12
Andre Light

Visual Studioでデータベースプロジェクトを使用できる場合は、プロジェクトで変更を行い、スキーマ比較を使用してデータベースへの変更を同期できます。

このように、依存オブジェクトの削除と再作成は、変更スクリプトによって処理されます。

5
Simon Zeinstra

tYPEをALTER/MODIFYすることはできません。既存のものを削除して、正しい名前/データ型で再作成するか、新しい列を追加する必要があります

3
user2767892

Simon Zeinstraが解決策を見つけました!

しかし、私はVisual Studioコミュニティ2015を使用し、スキーマ比較を使用する必要さえありませんでした。

SQL Server Object Explorerを使用して、DBにユーザー定義のテーブルタイプが見つかりました。 table-typeを右クリックして選択しました。これにより、TSQLコードが表示され、編集可能のIDEにコードタブが開きました。定義を変更し(私の場合はnvarcharフィールドのサイズを大きくしただけです)、タブの左上にあるUpdate Databaseボタンをクリックしました。

ねえプレスト! -SSMSのクイックチェックとudtt定義が変更されました。

素晴らしい-サイモンに感謝。

3
BioEcoSS

古いテーブルタイプを削除して、新しいテーブルタイプを作成する必要があります。ただし、依存関係(それを使用するストアドプロシージャ)がある場合は、削除できません。 別の回答を投稿 すべてのストアドプロシージャを一時的に削除し、テーブルテーブルを変更してからストアドプロシージャを復元するプロセスを自動化する方法について。

3
BornToCode