2016-12-23 10 views
0

データベースのvarcharカラムをすべてnvarcharに更新しようとしていますが、データを失うことはありません。SQL Serverデータベース内のすべてのvarcharカラムをnvarcharに変更する

I持って次のクエリ:

select * 
from INFORMATION_SCHEMA.COLUMNS 
where DATA_TYPE = 'varchar' 

は、どのように私はそれが見つかった列を更新するために、これを修正しないと、データベース全体に反映されていること?

+0

していない場合は、新しいテーブルを作成し、データを移行して元のデータを削除する必要があります。 – Hogan

答えて

4

私はSQL Serverの特定のsysカタログビューを使用して、私は何をしたいことはただ単にそれは、これらのデータ型を変更するのにかかる T-SQLステートメントを作成している - このような何か:

SELECT 
    t.name, s.name, c.name, 
    'ALTER TABLE ' + s.name + '.' + t.Name + ' ALTER COLUMN ' + c.name + ' NVARCHAR(' + 
     CASE 
      WHEN c.max_length = -1 THEN 'MAX' 
      WHEN c.max_length > 4000 THEN 'MAX' 
      ELSE CAST(c.max_length AS VARCHAR(10)) + ');' 
FROM 
    sys.tables t 
INNER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id 
INNER JOIN 
    sys.columns c ON c.object_id = t.object_id 
INNER JOIN 
    sys.types ty ON c.system_type_id = ty.system_type_id 
WHERE 
    ty.name = 'VARCHAR' 
    AND c.is_computed = 0 
をあなたは、新しいクエリウィンドウに出力グリッドからコピーして実行することができ

ALTER TABLE Sales.SalesOrderHeader ALTER COLUMN CreditCardApprovalCode NVARCHAR(15); 
ALTER TABLE Person.Password ALTER COLUMN PasswordHash NVARCHAR(128); 
ALTER TABLE Person.Password ALTER COLUMN PasswordSalt NVARCHAR(10); 

AdventureWorksデータベース、のようなこの意志の出力何かに

実行します。

注:AdventureWorksに対するあなたのオリジナルのスクリプトを実行している場合には、いずれかの列がに計算され、したがって、単にALTER TABLE ... ALTER COLUMN ....ステートメントを使用して変更することができないということを見せてくれた - 私は計算列を除くてる理由です私のスクリプトでここに示されています。

あなたが本当に主張する場合、あなたはまた、カーソルの「心」に私のこのSQL文をオンにしてから、テーブルを変更するためにT-SQLステートメントを反復、およびEXEC(...)またはEXEC sp_executesql

を使用して、それらを実行することができます
+0

+1計算された列の問題をキャッチします。現在、 '(max)'長さを扱う小さな更新が必要です。 'NVARCHAR(-1)'を返します。 – SqlZim

+0

本当に素敵な答えです! – LONG

+1

@SqlZim: 'VARCHAR(MAX)'ケースも同様に扱うサポートを追加しました –

関連する問題