多くのNCHAR(n)
列を含むデータベースがあります。これらの列の一部は単純なプロパティですが、一部は主キーまたは外部キーでもあります。
多くのテーブルと列、および膨大な量のテスト データがあります。
すべてNCHAR(n)
の列をNVARCHAR(n)
同じ長さの列に変換し、その間にその内容をトリミングする最良の方法は何ですか?
デザイナーで列を変更し、列名を覚えてスクリプトウィンドウでトリミングするよりも良いことを考えられる場合は、回答として投稿してください。
多くのNCHAR(n)
列を含むデータベースがあります。これらの列の一部は単純なプロパティですが、一部は主キーまたは外部キーでもあります。
多くのテーブルと列、および膨大な量のテスト データがあります。
すべてNCHAR(n)
の列をNVARCHAR(n)
同じ長さの列に変換し、その間にその内容をトリミングする最良の方法は何ですか?
デザイナーで列を変更し、列名を覚えてスクリプトウィンドウでトリミングするよりも良いことを考えられる場合は、回答として投稿してください。
このようなものは私が思うトリックを行います(主キーがない限り、エラーが発生します-あなたの場合、デザイナーで主キーを手動で行うことをお勧めします。それらを変更するには、制約を削除する必要があるなどです。そしてそれは少しトリッキーになります)...
すべてのテーブル名、列名、およびすべての列のサイズを取得し、それぞれが列タイプを変更するステートメントをnchar
実行してから、データをトリミングします。alter
update
よりパフォーマンスの高い方法があるかもしれませんが、一度だけ実行する場合は、おそらくこれで問題ありません(ああ、databaseName
ビットをデータベースの名前に変更してください)...
use databaseName
declare @tn nvarchar(128)
declare @cn nvarchar(128)
declare @ln int
declare @sql as nvarchar(1000)
declare c cursor for
select table_name,column_name,character_maximum_length
from information_schema.columns
where data_type ='nchar' and
TABLE_NAME not in (select TABLE_NAME from INFORMATION_SCHEMA.VIEWS)
open c
fetch next from c into @tn, @cn, @ln
while @@FETCH_STATUS = 0
begin
set @sql = 'alter table ' + @tn + ' alter column '
+ @cn + ' nvarchar(' + convert(nvarchar(50), @ln) + ')'
exec sp_executesql @sql
set @sql = 'update ' + @tn + ' set ' + @cn + ' = LTRIM(RTRIM(' + @cn + '))'
exec sp_executesql @sql
fetch next from c into @tn, @cn, @ln
end
close c
deallocate c