2

すべてのテーブルでデータ型をからに一度に変更しようとしてtextいます。varchar

このクエリ

  select *
  from information_schema.columns
  where data_type = 'text'

すべてのtextデータ型が表示されますが、これを使用して型をに変更するにはどうすればよいですかvarchar

4

3 に答える 3

1

すべてのtextntextおよびimageデータ型を新しいvarchar(max)nvarchar(max)およびvarbinary(max)データ型に変更します。

select 'alter table ' + quotename(c.TABLE_SCHEMA) + '.' + quotename(c.TABLE_NAME)
    + ' alter column ' + quotename(c.COLUMN_NAME) + ' '
    + case c.DATA_TYPE when 'image' then 'varbinary(max)' when 'ntext' then 'nvarchar(max)' when 'text' then 'varchar(max)' end + ' '
    + case c.IS_NULLABLE when 'YES' then 'not' else '' end + ' null;' as SqlCommand
    , *
from INFORMATION_SCHEMA.COLUMNS c
    join INFORMATION_SCHEMA.TABLES t on c.TABLE_CATALOG = t.TABLE_CATALOG
        and c.TABLE_SCHEMA = t.TABLE_SCHEMA
        and c.TABLE_NAME = t.TABLE_NAME
where c.DATA_TYPE in ('image', 'ntext', 'text')
    and t.TABLE_TYPE = 'BASE TABLE'

SqlCommand列をバッチとしてコピーして実行するだけです。

これにより、null可能性とフィルターアウトビューが処理されます。

text / ntext / image列にタイプ固有の制約を設定できるとは思わないので、おそらくPK / FK/UKをチェックする必要はありません。ただし、他のタイプの制約とデフォルトを考慮する必要があります。それらがたくさんある場合は、SSMSダイアグラムモードでこれらの変更を行う方が簡単な場合があります。

于 2013-03-25T14:22:26.880 に答える
0

クエリ結果からこれらのコマンドをコピーして実行します。

    select 
        cmd = 'alter table [' + c.table_schema + '].[' + c.table_name + '] alter column [' + c.column_name + '] varchar(<yoursize>)'
        ,*
    from information_schema.columns c
    where c.data_type='text'

だが:

  • テーブルのみを選択するには、テーブル情報を結合する必要があります(上記のクエリでもビューが返されます)
  • PK / FK制約など、一部の列を変更することはできません。
  • この選択により、変更したくない/変更できないテーブルもリストされる場合があります。例:sysdiagrams
  • 構造を正確に知っているいくつかのテーブルに制限しない場合は、一般に、このようにすることはお勧めできません。
于 2013-03-25T14:18:27.730 に答える
0

最初は、次のように単純に見えるかもしれません。

  1. information_schemaからの選択でカーソルループを使用します。
  2. ALTER TABLEステートメントを使用して、データ型を変更する対象の列ごとに動的SQLを作成します。
  3. 動的SQLを実行します。

ただし、最初にこれらの列のインデックス、外部キー制約などを削除する必要があります。その後、完了したら、制約とインデックスを再作成できます。

このSOの質問を参照してください:

テーブル内のすべての列のデータ型を一度に更新する単一のSQLクエリ

于 2013-03-25T14:19:23.247 に答える