SQL Serverでユーザー定義のテーブルタイプを変更するにはどうすればよいですか?
これは一種のハックですが、機能するようです。以下は、テーブルタイプを変更する手順と例です。 1つの注意点は、テーブルタイプに加えた変更がそのオブジェクト(通常はプロシージャ)に対する重大な変更である場合、sp_refreshsqlmoduleは失敗することです。
sp_rename
を使用してテーブルタイプの名前を変更します。通常、名前の先頭にzを追加します。sp_refreshsqlmodule
を実行します。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
警告:
これはデータベースを破壊する可能性があるため、最初に開発環境でテストすることをお勧めします。
退屈を最小限に抑え、エラーが発生しやすい半自動スクリプトや高価なツールを必要としない簡単な手順を次に示します。
[オブジェクトエクスプローラーの詳細]ウィンドウから複数のオブジェクトのDROP/CREATEステートメントを生成できることに注意してください(この方法で生成すると、DROPおよびCREATEスクリプトがグループ化され、ドロップアクションと作成アクションの間にロジックを簡単に挿入できます)。
インフラストラクチャアーキテクチャを変更することが理にかなっている小規模なプロジェクトがある場合は、ユーザー定義のテーブルタイプを削除することを検討してください。 Entity Frameworkおよび同様のツールを使用すると、データロジックのすべてではないにしても、ほとんどの場合、保守が容易なコードベースに移動できます。
Visual Studioでデータベースプロジェクトを使用できる場合は、プロジェクトで変更を行い、スキーマ比較を使用してデータベースへの変更を同期できます。
このように、依存オブジェクトの削除と再作成は、変更スクリプトによって処理されます。
tYPEをALTER/MODIFYすることはできません。既存のものを削除して、正しい名前/データ型で再作成するか、新しい列を追加する必要があります
Simon Zeinstraが解決策を見つけました!
しかし、私はVisual Studioコミュニティ2015を使用し、スキーマ比較を使用する必要さえありませんでした。
SQL Server Object Explorerを使用して、DBにユーザー定義のテーブルタイプが見つかりました。 table-typeを右クリックして選択しました。これにより、TSQLコードが表示され、編集可能のIDEにコードタブが開きました。定義を変更し(私の場合はnvarcharフィールドのサイズを大きくしただけです)、タブの左上にあるUpdate Databaseボタンをクリックしました。
ねえプレスト! -SSMSのクイックチェックとudtt定義が変更されました。
素晴らしい-サイモンに感謝。
古いテーブルタイプを削除して、新しいテーブルタイプを作成する必要があります。ただし、依存関係(それを使用するストアドプロシージャ)がある場合は、削除できません。 別の回答を投稿 すべてのストアドプロシージャを一時的に削除し、テーブルテーブルを変更してからストアドプロシージャを復元するプロセスを自動化する方法について。