SQL Server中的数据清理

时间:2013-05-22 21:28:38

标签: sql sql-server ssis

要求是清理数据。我已经将平面文件中的数据加载到SQL Server表中的某些列中有一些值,如-111,-11,-11,即从负值开始,并且有一些空格,我如何用a替换所有这些值我的数据库的所有表中都为NULL?

1 个答案:

答案 0 :(得分:1)

如果使用SQL Server 2012,请使用TRY_CONVERT函数来转换可以转换的内容,并使用其余的NULL。

TRY_CONVERT(DataType, FieldName) 

如果尝试清理数据,可以使用CHARINDEX查找无效值,在您的示例中,它是标准,或使用CHARINDEX的CASE语句:

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

这段代码非常愚蠢,它会在活动数据库中的每个表的每个字段中将每个' - '更新为NULL。好吧,在它的当前形式中,它将只创建将执行此操作的脚本,如果您运行它,然后运行它输出的代码,您将拥有所有更新语句。您可以添加where条件以“选择要迭代的部分”部分,即:WHERE t.name如'%tabletowreck%'或内部游标'WHERE c.name like'%badcolumn%'

由于两个游标'PRINT'这个代码可以安全运行,我相信如果你将PRINT改为EXEC都会出错,但是要小心这可能是非常危险的。