要件は、データをスクラブすることです。フラット ファイルから SQL Server テーブルの一部の列にデータをロードしました。-111、-11、-11 などの値があります。つまり、負の値で始まり、いくつかの空のスペースがあります。これらの値をすべてデータベースのすべてのテーブルで NULL ですか?
1 に答える
SQL Server 2012 を使用している場合は、TRY_CONVERT
関数を使用してキャストできるものをキャストし、残りを NULL にします。
TRY_CONVERT(DataType, FieldName)
データを消去しようとする場合は、CHARINDEX
無効な値を見つけるために使用できます。例では、where 基準、または を使用した CASE ステートメントになりますCHARINDEX
。
Fieldname = CASE WHEN CHARINDEX('-',Fieldname) > 0 THEN NULL ELSE Fieldname END
あなたの要求に従って:
DECLARE @Iterator varchar(55),@strSQL VARCHAR(8000)
DECLARE xyz CURSOR
FOR
--Select stuff to iterate over
SELECT DISTINCT t.name
FROM sys.columns c INNER JOIN
sys.tables t ON c.object_id = t.object_id INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
OPEN xyz
FETCH NEXT FROM xyz
INTO @Iterator
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff
SET @strSQL = '
DECLARE @Iterator2 varchar(55), @strSQL2 varchar(8000)
DECLARE xyz2 CURSOR
FOR
--Select stuff to iterate over
SELECT DISTINCT c.name
FROM sys.columns c INNER JOIN
sys.tables t ON c.object_id = t.object_id INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
WHERE t.name = '''+@Iterator+'''
OPEN xyz2
FETCH NEXT FROM xyz2
INTO @Iterator2
WHILE @@FETCH_STATUS = 0
BEGIN
--Do stuff
SET @strSQL2 = ''
UPDATE '+@Iterator+'
SET ''+@Iterator2+'' = NULL
WHERE CHARINDEX(''''-'''',''+@Iterator2+'') <> 0
''
PRINT @strSQL2
FETCH NEXT FROM xyz2
INTO @Iterator2
END
CLOSE xyz2
DEALLOCATE xyz2
GO
'
PRINT (@strSQL)
FETCH NEXT FROM xyz
INTO @Iterator
END
CLOSE xyz
DEALLOCATE xyz
GO
このコードはそのままでは信じられないほどばかげており、アクティブな DB 内のすべてのテーブルのすべてのフィールドで、すべての「-」を文字通り NULL に更新します。現在の形式では、それを実行するスクリプトを作成するだけです。それを実行し、出力されたコードを実行すると、すべての更新ステートメントが得られます。「反復するものを選択する」部分の両方に where 基準を追加できます。つまり、WHERE t.name like '%tabletowreck%' または内部カーソル 'WHERE c.name like '%badcolumn%'
両方のカーソルが 'PRINT' であるため、このコードは安全に実行できるため、両方の PRINT を EXEC に変更するとエラーになると思いますが、非常に危険な可能性があることに注意してください。