2017-05-16 9 views
1

データを新しいSQL Serverデータベースに移行する際に間違いを犯しました。ほとんどすべてのレコードがNULLになる必要があります。Sql Server:データベース内の 'null'文字列レコードをすべて更新します

データベース全体を更新し、それぞれの「ヌル」レコードを本物のヌルで置き換えるのに合理的に迅速な方法はありますか?

私はこのような何かをしようとしています:

SELECT ' update ' + TABLE_SCHEMA + '.' + TABLE_NAME + 'set value = null 
where value = 'NULL'' 
FROM INFORMATION_SCHEMA.TABLES 

が、私は、各テーブル内の各列を反復する方法についていくつかのアドバイスを探しています。

+1

これが新しいデータベースの場合は、もちろんプロセスを修正した後、データベースを削除して新しいものをインポートするほうが簡単でしょう。これはもちろんあなたのテストシステム上にあったのですか? –

+0

可能な複製http://stackoverflow.com/questions/25780297/how-to-update-all-tables-with-a-particular-column-name –

+0

@PrabhatGこれはSQL Serverでタグ付けされています。あなたが提案した複製はポストグレーであり、同じものではありません。 –

答えて

3

クエリを使用してsqlを作成できます。このようなもの。テキストとntextを処理する必要がある場合は、sys.typesのtype_id値を調べなければなりません。彼らは最初に使用されるべきであるので、私はそれらを含めなかった。

select 'update ' + QUOTENAME(s.name) + '.' + quotename(t.name) + 
    ' set ' + QUOTENAME(c.name) + ' = NULL where ' 
    + QUOTENAME(c.name) + ' = ''NULL''' 
from sys.tables t 
join sys.columns c on c.object_id = t.object_id 
join sys.schemas s on s.schema_id = t.schema_id 
where c.system_type_id in 
(
    167 --varchar 
    , 175 --char 
    , 231 --nvarchar 
    , 239 --nchar 
) 
+0

この質問からインスピレーションを得るhttp://stackoverflow.com/questions/25780297/how-to-update-all-tables-with -a-specific-column-name私はこれを思いついた: 'SELECT 'update' + table_schema + '。' + COLUMN_NAME + '= null' + 'COLUMN_NAME +' = 'null' '' ' FROM(INFORMATION_SCHEMA.COLUMNSからの テーブルスキーマ、テーブル名、COLUMN_NAME のDATA_TYPE =' varchar 'を選択)あなたの答えに違いはありますか? – Argentina

+1

@Argentinaこれは、char、nchar、およびnvarcharカラムではなく、varcharカラムのみを更新します。また、ビューはINFORMATION_SCHEMA.COLUMNSに含まれています。 – Peter

+1

あなたのコードがvarcharのみを更新する点を除いて、スキーマが正しいかどうかはわかりません。 INFORMATION_SCHEMAビューは常に信頼できるとは限りません。ドキュメントでも、使用しないことを示唆していることに注意してください。 https://docs.microsoft.com/en-us/sql/relational-databases/system-information-schema-views/columns-transact-sql –

1

夜間にクエリを実行することができます。すべての文を実行するよりも、各文字列型の列に対して更新文を作成します。

declare @sql nvarchar(max) = '' 

select @sql = @sql + 'update '+ t.name + ' set '+ c.name + ' = null where '+ c.name + '=''null''' +char(13) + char(10) 
from sys.tables t 
join sys.columns c on t.object_id = c.object_id 
join sys.types ty on c.system_type_id = ty.system_type_id 
where ty.name like '%char' 

exec sp_executesql @sql 
関連する問題