-4

要件は、データをスクラブすることです。フラット ファイルから SQL Server テーブルの一部の列にデータをロードしました。-111、-11、-11 などの値があります。つまり、負の値で始まり、いくつかの空のスペースがあります。これらの値をすべてデータベースのすべてのテーブルで NULL ですか?

4

1 に答える 1

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 に変更するとエラーになると思いますが、非常に危険な可能性があることに注意してください。

于 2013-05-22T21:51:06.983 に答える